複雑なOR検索
SearchEntriesプラグインをバージョンアップして、複雑なOR検索を行う機能を追加しました。
セクション間のOR検索
最初のバージョンでは、検索条件のセクション(ブログ記事のフィールド/カテゴリ/タグ/カスタムフィールド)の間で、OR検索を行うことができませんでした。
例えば、「タイトルに『プラグイン』を含むか、または『CMS』というタグがついている」という検索を行いたいとします。
「タイトルに『プラグイン』を含む」という条件は、ブログ記事のフィールドのセクションで条件を指定します。
一方、「『CMS』というタグがついている」という条件は、カスタムフィールドのセクションで条件を指定します。
この検索は、異なるセクションの間のORになるので、行うことができませんでした。
手順
今回のバージョンでは、このような検索を行う機能を追加しました。
ただし、検索条件を指定する際には、やや頭を使う必要があります。
1.検索条件の分割
まず、ORでつなぎたい検索条件を、以下の各部分に分けます。
- (a)ブログ記事のフィールド以外の1つのセクションだけで表せる条件
- (b)ブログ記事のフィールドのセクションと、ブログ記事以外のセクションとのANDで表せる条件
- (c)ブログ記事のフィールド以外のセクションどうしのANDで表せる条件
- (d)ブログ記事のフィールドのセクションだけで表せる条件
2.各部分の検索
次に、(a)~(c)の各条件をMTSearchConditionsタグのブロックで表し、検索されたブログ記事のIDを、それぞれ変数に代入します。
それには、MTSearchConditionsタグに「entry_ids="変数名"」というモディファイアを指定します。
<mt:SearchConditions entry_ids="変数名">
検索の条件を指定するテンプレートタグ
</mt:SearchConditions>
3.ORによる結合
最後に、「ブログ記事のIDが、上の(a)~(c)の結果の変数の値になっている」という条件と、(d)の条件とのORを取ります。
そして、その条件を満たすブログ記事を読み込みます。
例えば、前述の(a)~(c)にあたる条件が3種類あり、それぞれの結果を、変数eid1~eid3に代入したとします。
この場合、以下のようにテンプレートを組みます。
<mt:SearchConditions>
<$mt:SearchConditionValues field="id" values="$eid1"$>
<$mt:SearchConditionUnion op="or"$>
<$mt:SearchConditionValues field="id" values="$eid2"$>
<$mt:SearchConditionUnion op="or"$>
<$mt:SearchConditionValues field="id" values="$eid3"$>
<$mt:SearchConditionUnion op="or"$>
<mt:SearchConditionSection>
(d)の条件を表すテンプレートタグ
</mt:SearchConditionSection>
</mt:SearchConditions>
なお、(d)で表せる条件がない場合は、上のリストのMTSearchConditionSectionタグのブロックと、その直前の<$mt:SearchConditionUnion op="or"$>のタグを省略します。
事例
例えば、以下のようなブログがあるとします。
- 1.記事にサブタイトルを付けるために、テキスト型のカスタムフィールドを追加しているとします。
- 2.1.のカスタムフィールドのベースネームは、「entry_subtitle」にしているとします。
- 3.タイトル/サブタイトルのどちらかに「Movable Type」を含むか、もしくは「Movable Type」のタグを付けているブログ記事を検索します。
まず、上記の条件を、前述の3-1.の手順に沿って、複数の条件に分解します。
実際に分解すると、3-1.の(a)~(d)のそれぞれに当てはまる条件は、以下の表のようになります。
パターン | 条件 |
(a)ブログ記事のフィールド以外の1つのセクションだけで表せる条件 | ・サブタイトルのカスタムフィールドに「Movable Type」を含む ・「Movable Type」のタグがついている |
(a)ブログ記事のフィールドのセクションと、ブログ記事以外のセクションとのANDで表せる条件 | なし |
(c)ブログ記事のフィールド以外のセクションどうしのANDで表せる条件 | なし |
(d)ブログ記事のフィールドのセクションだけで表せる条件 | タイトルに「Movable Type」を含む |
まず、(a)の2つの条件を、それぞれMTSearchConditionsタグのブロックで表し、検索されたブログ記事のIDを、変数に代入します。
そして、それらのIDと、(d)の条件とのORを取ります。
(a)の2つの条件の結果を、それぞれ変数eid1/eid2に代入するとすれば、この検索条件は以下のようなテンプレートで表すことができます。
<mt:SearchConditions entry_ids="eid1">
<mt:SearchConditionCFSection field="entry_subtitle">
<$mt:SearchConditionCFLike values="Movable Type"$>
</mt:SearchConditionCFSection>
</mt:SearchConditions>
<mt:SearchConditions entry_ids="eid2">
<mt:SearchConditionTagSection>
<$mt:SearchConditionTag tag="Movable Type"$>
</mt:SearchConditionTagSection>
</mt:SearchConditions>
<mt:SearchConditions>
<$mt:SearchConditionValues field="id" values="$eid1"$>
<$mt:SearchConditionUnion op="or"$>
<$mt:SearchConditionValues field="id" values="$eid2"$>
<$mt:SearchConditionUnion op="or"$>
<mt:SearchConditionSection>
<$mt:SearchConditionLike field="title" values="Movable Type"$>
</mt:SearchConditionSection>
</mt:SearchConditions>
1~5行目で、サブタイトルのカスタムフィールドに「Movable Type」を含むブログ記事を検索し、それらの記事のIDを、変数eid1に代入します。
次の6~10行目で、「Movable Type」のタグがついているブログ記事を検索し、それらの記事のIDを、変数eid2に代入します。
そして、残りの部分で、前述の2つの条件のどちらかを満たすブログ記事か、またはタイトルに「Movable Type」を含むブログ記事を検索します。