複数のブログの記事を複雑な条件で混在させて出力する(その2)

昨日の「ブログAの『ニュース』カテゴリの記事と、ブログBのすべての記事を混在して、その中から最新の5件だけを出力したい。」という話題を、拙作のSearchEntriesプラグインで実現する方法を紹介します。

1.考え方

SearchEntriesプラグインでは、カテゴリ/タグ/カスタムフィールドを組み合わせて、様々な条件でブログ記事を検索することができます。
ただ、ブログ記事そのもののフィールドと、カテゴリ/タグ/カスタムフィールドのいずれかの条件を組み合わせる場合は、1回の検索ではAND検索しか行うことができません。

今回の事例だと、以下の2つの条件をOR検索することが必要になります。

  • ブログAに属し、かつ「ニュース」カテゴリに属する
  • ブログBに属する

そこで、以下の手順で検索を行います。

  • 上記の1つ目の条件でまず検索し、検索結果中の最新5件のブログ記事のIDを得る
  • 「記事のIDが、上の検索結果ものになっているもの」と、「ブログBに属する」の条件のORで検索して、最新5件のブログ記事を得る
  • 得られたブログ記事を出力する

2.テンプレートの書き方

上の考え方に基づいて、SearchEntriesプラグインを使ってテンプレートを書くと、以下のようになります。

<mt:SearchConditions include_blogs="ブログAのID" entry_ids="eids">
  <mt:SearchConditionCategorySection>
    <$mt:SearchConditionCategory category="ニュース"$>
  </mt:SearchConditionCategorySection>
  <$mt:SearchSortOrder sort_by="authored_on" sort_order="desc"$>
  <$mt:SearchLimit limit="5"$>
</mt:SearchConditions>
<mt:SearchConditions>
  <$mt:SearchConditionValues field="id" values="$eids"$>
  <$mt:SearchConditionUnion op="or"$>
  <$mt:SearchConditionValues field="blog_id" values="ブログBのID"$>
  <$mt:SearchSortOrder sort_by="authored_on" sort_order="desc"$>
  <$mt:SearchLimit limit="5"$>
</mt:SearchConditions>
<mt:IfNonZero tag="SearchLoadedEntryCount">
  <mt:Entries>
    検索されたブログ記事の情報を出力するテンプレートタグやHTML
  </mt:Entries>
</mt:IfNonZero>

1~7行目は、ブログAの「ニュース」カテゴリに属するブログ記事の中から、最新の5件を検索する処理です。
ただし、ブログ記事全体を読み込まずに、記事のIDだけを読み込んで、配列変数eidsに代入します。

8~14行目は、以下のどちらかの条件を満たすブログ記事の中から、最新の5件を検索する処理です。

  • idフィールド(ブログ記事のID)の値が、配列変数eidsのどれかの値に等しい(=ブログAの「ニュース」カテゴリに属する)
  • blog_idフィールド(ブログ記事が属するブログのID)の値が、ブログBのIDに等しい

そして、15~19行目で、検索されたブログ記事を出力します。