ブログ記事詳細検索プラグイン(その24・検索フォーム/検索結果表示の事例・カテゴリのOR検索)

検索フォームで、ブログ記事が属するカテゴリを条件に指定したい場合もあります。
今回はその場合の検索フォームと検索結果表示テンプレートの作り方を解説します。

カテゴリで検索

以下のような事例を基に解説します。

  • 冒頭の画面のように、検索フォームにカテゴリの一覧を表示し、チェックボックスでカテゴリを選べるようにします。
  • 検索結果表示用のテンプレートモジュールには、「詳細検索結果」という名前を付けるものとします。

1.検索フォームの作成

複数のカテゴリのOR検索を行えるようにしたい場合、MTTopLevelCategories等のタグを使って、カテゴリを選択する欄を出力します。
各カテゴリの選択欄は、以下のどちらかの方法で作ります。

  • 複数選択可能なselectを使う(multiple属性を付ける)
  • カテゴリ毎にチェックボックスを作り、すべてのチェックボックスのname属性を同じ値にする

また、フォームからCGIに送信する値(selectやチェックボックスのvalue属性)として、カテゴリの名前か、カテゴリのIDを使います。

ここでは例として、冒頭の画面のように、カテゴリをチェックボックスで選択できるようにします。
また、フォームからCGIにカテゴリ名を送信するようにします。

この場合、MTTopLevelCategoriesタグのブロックでカテゴリを順に取り出し、カテゴリ毎にチェックボックスを出力します。
また、チェックボックスのvalue属性をカテゴリ名(MTCategoryLabelタグ)にして、CGIにカテゴリ名が送信されるようにします。

実際に検索フォームを組むと、以下のようになります。
7/17行目のMTTopLevelCategoriesタグでカテゴリを順に出力し、11行目でチェックボックスを出力します。

<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="詳細検索結果"$>" />
  <div>
    <label for="entry_price">カテゴリ</label>
    <div id="cattree_div">
    <mt:SortedTopLevelCategories>
      <mt:SubCatIsFirst>
        <ul class="cattree">
      </mt:SubCatIsFirst>
      <li><input type="checkbox" name="cat" value="<$mt:CategoryLabel$>" /><$mt:CategoryLabel><br />
      <$mt:SubCatsRecurse$>
      </li>
      <mt:SubCatIsLast>
        </ul>
      </mt:SubCatIsLast>
    </mt:SortedTopLevelCategories>
    </div>
  </div>
  <p>
    <input type="submit" value="送信" />
  </p>
</form>

なお、上のフォームでは、カテゴリの階層が分かるように、カテゴリをul/li要素で出力しています。
適宜スタイルシートを指定して、要素の書式も設定するようにします。

このフォームを含むテンプレートの例は、以下のリンクからダウンロードすることができます。

カテゴリでOR検索する場合の検索フォームテンプレートの例

2.検索結果テンプレートの作り方

次に、検索結果テンプレートを作ります。

フォーム側で複数選択のselectを使うか、name属性が同じチェックボックスを多数使った場合、検索結果テンプレートでMTGetQueryParamsToVarsタグを実行すると、select/チェックボックスで選択された項目が、「qp_name属性_a」のような名前の配列変数に代入されます。
例えば、1.で作ったフォームだと、チェックボックスのname属性を「cat」にしていました。
この場合だと、MTGetQueryParamsToVarsタグによって、チェックボックスで選択された個々のカテゴリが、「qp_cat_a」という名前の配列変数に代入されます。

この配列を、MTSearchConditionCategoryタグのcategoryモディファイアや、MTSearchConditionCategoryIDタグのinclude_cat_idsモディファイアに指定します。
ただし、フォームでカテゴリが1つも選択されていない場合、MTSearchConditionCategory/MTSearchConditionCategoryIDタグがエラーになります。
そこで、MTSearchConditionCategorySectionタグを、「<mt:If name="qp_name属性_a">」~「</mt:If>」のタグで囲んで、カテゴリが選択されていない時にはMTSearchConditionCategorySectionタグのブロックを実行しないようにします。

ここまでの話に基づいて、検索結果テンプレートの主要部分を作ると、以下のようになります。
4~6行目のMTSearchConditionCategorySectionタグで、フォームで選択されたカテゴリを元に、ブログ記事を検索しています。

<$mt:GetQueryParamsToVars$>
<mt:SearchConditions>
  <mt:If name="qp_cat_a">
    <mt:SearchConditionCategorySection>
      <$mt:SearchConditionCategory category="$qp_cat_a"$>
    </mt:SearchConditionCategorySection>
  </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.SearchEntriesプラグイン関係の記事の一覧

SearchEntriesプラグイン関係のその他の記事は、以下のリンクから参照できます。

MT Cloud Starter Kit
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください