拙著「WordPress Web開発逆引きレシピ」が発売されました。
WordPressの様々なカスタマイズについて、逆引きの形式で取り上げています。
PHP 7.0での動作確認も行っています。
SearchEntries プラグインでMore Custom FieldsプラグインのCheckbox Groupを検索する(動的編)
昨日の記事の続きで、More Custom Fieldsプラグインで作ったチェックボックスグループと、SearchEntriesプラグインを組み合わせて、検索を行う方法を紹介します。
今日は、検索フォームを使って、動的に検索できるようにする手順を解説します。
1.検索フォームの作成
まず、検索フォームを作ります。
チェックボックスグループの個々のチェックボックスを検索フォームに出力する方法は、ドロップダウンのカスタムフィールドを検索フォームに出力する方法とほぼ同じです。
拙作のSupplementalCFTagsプラグインを使って、カスタムフィールドのオプションの値を読み込みます。
また、個々のチェックボックスのname属性には、同じ値を指定するようにします。
例えば、昨日の記事のように、ベースネームが「chkgrp」のカスタムフィールドを作って、色を選択できるようにしたとします。
そして、この色で検索できるように、フォームを作りたいとします。
チェックボックスのname属性を「chkgrp」にするとすれば、検索フォームは以下のように作ることができます。
<form method="get" action="<$mt:RealtimeRebuildCGIPath$>"> <input type="hidden" name="blog_id" value="<$mt:BlogID$>" /> <input type="hidden" name="tmpl_id" value="<$mt:GetTemplateID tmpl_name="チェックボックスグループ検索結果"$>" /> <p> <label for="chkgrp">色</label><br /> <mt:LoadCustomFieldInfo basename="chkgrp"> <mt:CustomFieldOptions> <input type="checkbox" name="chkgrp" value="<$mt:CustomFieldOptionValue$>" /> <$mt:CustomFieldOptionValue$> </mt:CustomFieldOptions> </mt:LoadCustomFieldInfo> </p> <p> <input type="submit" value="送信" /> </p> </form>
6~10行目の部分で、ベースネームが「chkgrp」のチェックボックスグループからオプションの値を1つずつ読み込み、8行目でチェックボックスを順次出力しています。
なお、このフォームを含むテンプレートの例は、以下のリンクからダウンロードすることができます。
ドロップダウンのカスタムフィールドを検索する場合の検索フォームテンプレートの例
2.OR検索を行う
次に、検索結果テンプレートを作ります。
検索フォーム側で複数のチェックボックスをオンにされたときの動作として、以下の2つが考えられます。
- それらのどれか1つの条件を満たす記事を検索する(OR検索)
- すべての条件を満たす記事を検索する(AND検索)
例えば、検索フォームで「赤」と「青」のチェックボックスをオンにされた場合、赤か青がオンになっている記事を検索するのがOR検索で、赤と青の両方がオンになっている記事を検索するのがAND検索です。
まず、OR検索から解説します。
OR検索を行う場合、選択されたチェックボックスの値をコンマで区切って並べ、MTSearchConditionCFLikeタグのvaluesモディファイアに指定します(昨日の記事を参照)。
また、検索フォームで入力された値をMTGetQueryParamsToVarsタグで変数に代入すると、検索フォームのチェックボックスで選択された値がコンマで区切られて、「qp_フィールド名」の変数に代入されます。
したがって、この変数を、MTSearchConditionCFLikeタグのvaluesモディファイアに指定すれば良いです。
ここまでの話に基づいて、以下の仕様で検索結果を出力する部分を作るとします。
- カスタムフィールドのベースネームは「chkgrp」
- 検索フォーム側で、チェックボックスのname属性を「chkgrp」にした
実際に検索結果を出力する部分を作ると、以下のようになります。
5行目のMTSearchConditionCFLikeタグで、values属性に、変数qp_chkgrpの値(検索フォームでチェックされた値をコンマで区切ったもの)を指定しています。
<$mt:GetQueryParamsToVars$> <mt:SearchConditions> <mt:If name="qp_chkgrp"> <mt:SearchConditionCFSection field="chkgrp"> <$mt:SearchConditionCFLike values="$qp_chkgrp"$> </mt:SearchConditionCFSection> </mt:If> </mt:SearchConditions> <mt:IfNonZero tag="SearchLoadedEntryCount"> <p><$mt:SearchLoadedEntryCount$>件</p> <mt:Entries> <$mt:Include module="ブログ記事の概要"$> </mt:Entries> <mt:Else> <p>条件に合う記事がありませんでした。</p> </mt:IfNonZero>
なお、上記の部分を含むテンプレートの例は、以下のリンクからダウンロードすることができます。
チェックボックスグループのカスタムフィールドをOR検索する場合の検索結果表示テンプレートの例
3.AND検索を行う
AND検索を行う場合、MTSearchConditionCFLikeタグを複数回書きます(昨日の記事を参照)。
また、検索フォーム側に同じname属性のフィールドが複数ある場合、MTGetQueryParamsToVarsタグで値を変数に代入すると、「qp_フィールド名_a」という名前の配列が作られて、その配列の個々の要素に、個々のフィールドの値が代入されます。
そこで、MTLoopタグで配列から1つずつ要素を取り出し、その値をMTSearchConditionCFLikeタグのvalues属性に指定すれば、検索フォームの条件に沿ってAND検索を行うことができます。
ここまでの話に基づいて、以下の仕様で検索結果を出力する部分を作るとします。
- カスタムフィールドのベースネームは「chkgrp」
- 検索フォーム側で、チェックボックスのname属性を「chkgrp」にした
実際に検索結果を出力する部分を作ると、以下のようになります。
<$mt:GetQueryParamsToVars$> <mt:SearchConditions> <mt:If name="qp_chkgrp_a"> <mt:SearchConditionCFSection field="chkgrp"> <mt:Loop name="qp_chkgrp_a"> <$mt:SearchConditionCFLike values="$__value__"$> </mt:Loop> </mt:SearchConditionCFSection> </mt:If> </mt:SearchConditions> <mt:IfNonZero tag="SearchLoadedEntryCount"> <p><$mt:SearchLoadedEntryCount$>件</p> <mt:Entries> <$mt:Include module="ブログ記事の概要"$> </mt:Entries> <mt:Else> <p>条件に合う記事がありませんでした。</p> </mt:IfNonZero>
1行目のMTGetQueryParamsToVarsタグによって、検索フォームでチェックされた値は、配列変数qp_chkgrp_aに代入されます。
そこで、5~7行目のMTLoopタグの繰り返しを使って、配列変数qp_chkgrp_aから値を1つずつ取り出し、その値をMTSearchConditionCFLikeタグのvalues属性に指定して、検索を行います。
なお、上記の部分を含むテンプレートの例は、以下のリンクからダウンロードすることができます。