SearchEntriesプラグインでサブカテゴリも含めて検索する

SearchEntriesプラグインでは、カテゴリを指定して記事を検索することができます。
その際に、あるカテゴリを指定したら、そのサブカテゴリ(さらにその下の子孫カテゴリすべて)も、検索対象にしたい場合があります。
その方法を紹介します。

MTSubCategoriesタグでサブカテゴリのIDを指定する

SearchEntriesプラグイン自体には、サブカテゴリも含めて検索する機能はありません。
ただ、複数のカテゴリを指定して検索することはできます。

そこで、Movable Type標準のMTSubCategoriesタグと組み合わせます。
考え方は以下の通りです。

  • MTSubCategoriesタグで、カテゴリの配下にあるすべてのサブカテゴリを読み込みます。
  • 各サブカテゴリのIDをコンマで連結して、文字列化ます。
  • MTSearchConditionCategoryIDタグのinclude_cat_idsモディファイアに、上で作った文字列を指定します。

事例

例えば、検索フォームに、トップレベルカテゴリ一覧のチェックボックスを出力するとします。
そして、検索結果では、選ばれたトップレベルカテゴリを元に、配下のサブカテゴリも含めて検索するとします。

検索フォーム側

まず、検索フォーム側に以下のような部分を入れ、各トップレベルカテゴリのチェックがオンになった時に、そのサブカテゴリも含めたカテゴリIDを送信するようにします。

<mt:TopLevelCategories>
  <mt:SubCatIsFirst><ul></mt:SubCatIsFirst>
  <$mt:CategoryID setvar="cat_ids"$>
  <mt:SubCategories>
    <mt:SetVarBlock name="cat_ids" append="1">,<$mt:CategoryID$></mt:SetVarblock>
    <$mt:SubCatsRecurse$>
  </mt:SubCategories>
  <li><input type="checkbox" name="cat_ids" value="<$mt:GetVar name="cat_ids"$>" /><$mt:CategoryLabel$></li>
  <mt:SubCatIsLast></ul></mt:SubCatIsLast>
</mt:TopLevelCategories>

上記の内容は以下の通りです。

  • 1/10行目
    トップレベルカテゴリを順に読み込みます。
  • 2/9行目
    ul要素の開始タグと終了タグを出力します。
  • 3行目
    個々のトップレベルカテゴリのIDを、変数cat_idsに代入します。
  • 4/7行目
    個々のトップレベルカテゴリの配下にあるサブカテゴリを順に読み込みます。
  • 5行目
    サブカテゴリのIDを、コンマで区切って、変数cat_idsに連結します。
  • 6行目
    さらに下の階層のカテゴリを読み込みます。
  • 8行目
    チェックボックスを出力し、そのvalue属性として、変数cat_idsの値(=トップレベルカテゴリのIDと、その配下にあるすべてのサブカテゴリのIDを、コンマで区切った文字列)を出力します。

検索結果側

検索結果を表示するテンプレートでは、MTSearchConditionsタグのブロックの中に、以下のような部分を入れます。
フォームから送信されたカテゴリのIDを、MTSearchConditionCategoryIDタグに指定します。

<$mt:GetQueryParamsToVars$>
<mt:SearchConditions ・・・>
  ・・・
  <mt:If name="qp_cat_ids">
    <mt:SearchConditionCategorySection>
      <$mt:SearchConditionCategoryID include_cat_ids="$qp_cat_ids"$>
    </mt:SearchConditionCategorySection>
  </mt:If>
  ・・・
</mt:SearchConditions>