ブログ記事詳細検索プラグイン(その14・複雑なOR検索)

SearchEntriesプラグインを若干バージョンアップして、複雑なOR検索を行う機能を追加しました。

1.ダウンロードとインストール

新しいバージョンは、以下からダウンロードすることができます。

SearchEntries_1_05.zip

ダウンロードしたZipファイルを解凍すると、「plugins」というフォルダができます。
このフォルダを、Movable Typeのインストール先にアップロードします。

2.セクション間のOR検索

最初のバージョンでは、検索条件のセクション(ブログ記事のフィールド/カテゴリ/タグ/カスタムフィールド)の間で、OR検索を行うことができませんでした。

例えば、「タイトルに『プラグイン』を含むか、または『CMS』というタグがついている」という検索を行いたいとします。
「タイトルに『プラグイン』を含む」という条件は、ブログ記事のフィールドのセクションで条件を指定します。
一方、「『CMS』というタグがついている」という条件は、カスタムフィールドのセクションで条件を指定します。
この検索は、異なるセクションの間のORになるので、行うことができませんでした。

3.手順

今回のバージョンでは、このような検索を行う機能を追加しました。
ただし、検索条件を指定する際には、やや頭を使う必要があります。

3-1.検索条件の分割

まず、ORでつなぎたい検索条件を、以下の各部分に分けます。

  • (a)ブログ記事のフィールド以外の1つのセクションだけで表せる条件
  • (b)ブログ記事のフィールドのセクションと、ブログ記事以外のセクションとのANDで表せる条件
  • (c)ブログ記事のフィールド以外のセクションどうしのANDで表せる条件
  • (d)ブログ記事のフィールドのセクションだけで表せる条件

3-2.各部分の検索

次に、(a)~(c)の各条件をMTSearchConditionsタグのブロックで表し、検索されたブログ記事のIDを、それぞれ変数に代入します。
それには、MTSearchConditionsタグに「entry_ids="変数名"」というモディファイアを指定します。

<mt:SearchConditions entry_ids="変数名">
  検索の条件を指定するテンプレートタグ
</mt:SearchConditions>

3-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"$>のタグを省略します。

4.事例

例えば、以下のようなブログがあるとします。

  • 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」を含むブログ記事を検索します。

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

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