SearchEntriesプラグインでMore Custom FieldsプラグインのCheckbox Groupを検索する(静的編)

Dan Wolfgang氏が作ったMore Custom Fieldsプラグインを使うと、複数のチェックボックスを組み合わせたカスタムフィールド(Checkbox Group)などを追加することができます。
このプラグインで追加したカスタムフィールドを、SearchEntriesプラグインで検索したいという要望がありましたので、その方法を紹介します。
今日は、Checkbox Groupのカスタムフィールドを静的に検索する方法を紹介します。

1.Checkbox Groupでデータベースに保存される値

Checkbox Groupのカスタムフィールドを作ってデータを入力すると、オンになっているチェックボックスの値をカンマで区切って連結した値が、データベースに保存されます。

例えば、以下の画面のように、赤/青/黄/緑の4つのチェックボックスを作って、赤と黄のチェックをオンにして保存したとします。
この場合、データベースには、このカスタムフィールドの値として「赤, 黄」が保存されます。

Checkbox Groupの例

2.チェックボックスがオンになっている記事を検索する

SearchEntriesプラグインを使えば、Checkbox Groupの中で、特定のチェックボックスがオンになっている記事を検索することができます。

前述したように、チェックボックスをオンにすると、そのチェックボックスの値を含んだ文字列が、データベースに保存されます。
したがって、MTSearchConditionCFLikeタグを使って、「○○を含む」の条件で検索するようにします。

例えば、前述の4色のチェックボックスの例で、「赤」のチェックボックスがオンになっている記事を検索したいとします。
また、このカスタムフィールドのベースネームが「chkgrp」だとします。
この場合、MTSearchConditionsタグのブロックを以下のように書きます。

<mt:SearchConditions>
  <mt:SearchConditionCFSection field="chkgrp">
    <$mt:SearchConditionCFLike values="赤"$>
  </mt:SearchConditionCFSection>
</mt:SearchConditions>

3.複数のチェックボックスがオンになっている記事を検索する

複数のチェックボックスがオンになっている記事を検索することもできます。

OR検索を行いたい場合は、MTSearchConditionCFLikeタグのfieldモディファイアに、個々のチェックボックスの値をコンマで区切った文字列を指定します。
例えば、「赤」か「青」のチェックボックスがオンになっている記事を検索したい場合は、以下のように書きます。

<mt:SearchConditions>
  <mt:SearchConditionCFSection field="chkgrp">
    <$mt:SearchConditionCFLike values="赤,青"$>
  </mt:SearchConditionCFSection>
</mt:SearchConditions>

また、AND検索を行いたい場合は、チェックボックスの値毎に、MTSearchConditionCFLikeタグの行を書きます。
例えば、「赤」と「青」の両方のチェックボックスがオンになっている記事を検索したい場合は、以下のように書きます。

<mt:SearchConditions>
  <mt:SearchConditionCFSection field="chkgrp">
    <$mt:SearchConditionCFLike values="赤"$>
    <$mt:SearchConditionCFLike values="青"$>
  </mt:SearchConditionCFSection>
</mt:SearchConditions>

4.複雑な検索が必要な場合もある

たいていの場合は、上記の方法で検索を行うことができます。
ただ、あるチェックボックスの値に、他のチェックボックスの値が丸々含まれている場合は、上記の方法では正しく検索できません。

例えば、前述の色の例で、「黄緑」のチェックボックスを追加したとします。
この場合、「黄」は「黄緑」に含まれますので、「あるチェックボックスの値に、他のチェックボックスの値が丸々含まれている場合」に該当します。

ここで、以下のようにして、「黄」のチェックボックスがオンになっている記事を検索しようとしたとします。

<mt:SearchConditions>
  <mt:SearchConditionCFSection field="chkgrp">
    <$mt:SearchConditionCFLike values="黄"$>
  </mt:SearchConditionCFSection>
</mt:SearchConditions>

ところが、この書き方だと、「カスタムフィールドの値に『黄』を含む」という条件を指定したことになります。
そのため、「黄」のチェックボックスがオンの記事だけでなく、「黄緑」のチェックボックスがオンの記事も検索されてしまいます。

上記のような例で正しく検索を行うには、「『黄』は含まれるが、『黄緑』は含まれない」という条件を指定する必要があります。
具体的には、以下のような書き方をします。

<mt:SearchConditions>
  <mt:SearchConditionCFSection field="chkgrp">
    <$mt:SearchConditionCFLike values="黄 AND NOT 黄緑"$>
  </mt:SearchConditionCFSection>
</mt:SearchConditions>

静的な検索なら、上記のような対応をやりやすいです。
ただ、フォームを使った動的な検索だと、検索条件の作り方が難しくなってしまいます。
基本的には、「あるチェックボックスの値に、他のチェックボックスの値が丸々含まれる」ということがないように、チェックボックスの作り方を工夫していただいた方が良いです。

例えば、ここまでで取り上げた色のチェックボックスの場合だと、各チェックボックスの値を「01赤」「02青」「03黄」「04緑」「05黄緑」のようにして、連番を振るようにします。
こうすれば、「あるチェックボックスの値に、他のチェックボックスの値が丸々含まれる」という状況ではなくなります(「05黄緑」には「03黄」は含まれない)。
また、検索のテンプレートでも、以下のように連番をつけた値で検索するようにします。

<mt:SearchConditions>
  <mt:SearchConditionCFSection field="chkgrp">
    <$mt:SearchConditionCFLike values="03黄"$>
  </mt:SearchConditionCFSection>
</mt:SearchConditions>

5.SearchEntriesプラグイン関係の記事の一覧

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