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

Facebookの「Movable Type勉強会」のグループで、以下のような質問を見かけました。

ブログAの「ニュース」カテゴリの記事と、ブログBのすべての記事を混在して、その中から最新の5件だけを出力したい。

この問題の解決方法として、まずハッシュを使う方法を紹介します。

1.考え方

Movable Typeのテンプレートタグでは、ハッシュを使って、様々な情報を並べ替えて出力することができます。
その手順は以下の通りです。

  • ハッシュのキーとして、並べ替えの基準となる値を代入する
  • 個々のキーに対する値として、出力したい内容を代入する
  • MTLoopタグに「sort_by="key"」のモディファイアを指定し、ハッシュをキーで並べ替えて出力する

今取り上げている例だと、ブログ記事を最新順に出力したいので、記事の日付で並べ替えれば良いです。
したがって、ハッシュのキーとして、個々の記事の日付を代入します。
また、それぞれのキーに対する値として、出力したい記事の情報(タイトル等)を代入します。

なお、ブログA/ブログBの2つのブログから記事を取り出し、最新の5件を出力する場合、5件すべてがブログAの記事になることもあれば、すべてがブログBの記事になることもあります。
そこで、ブログA/ブログBのそれぞれから最新の5件ずつの記事を読み込み、日付で並べ替えた上で、その中の5件だけを出力するようにします。

2.テンプレートの組み方

ここまでの話に基づいてテンプレートを組むと、以下のようになります。

<mt:Entries include_blogs="ブログAのID" category="ニュース" lastn="5">
  <$mt:EntryDate format="%Y%m%d%H%M%S" setvar="key"$>
  <mt:SetVarBlock name="entries" key="$key">
    ブログ記事の情報を出力するためのテンプレートタグやHTML
  </mt:SetVarBlock>
</mt:Entries>
<mt:Entries include_blogs="ブログBのID" lastn="5">
  <$mt:EntryDate format="%Y%m%d%H%M%S" setvar="key"$>
  <mt:SetVarBlock name="entries" key="$key">
    ブログ記事の情報を出力するためのテンプレートタグやHTML
  </mt:SetVarBlock>
</mt:Entries>
<mt:Loop name="entries" sort_by="key numeric reverse">
  <mt:If name="__counter__" le="5">
  <$mt:GetVar name="__value__"$>
  </mt:If>
</mt:Loop>

1~6行目は、ブログAの「ニュース」カテゴリの記事から最新の5件を読み込み、ハッシュを組み立てる部分です。
2行目のMTSetVarタグで、変数keyにブログ記事の日付を代入します。
そして、3~5行目のMTSetVarBlockタグで、「entries」という名前のハッシュの中で、キーが変数keyの要素に、出力したい内容を代入します。

7~12行目は、1~6行目と同様の手順で、ブログBの全記事から最新の5件を読み込んで、ハッシュ「entries」に記事の情報を追加します。

そして、13~17行目で、ハッシュの内容を順に出力します。
13行目では、sort_byモディファイアに「key numeric reverse」を指定して、キーの値を数値とみなし、逆順(=日付の新しい順)に並べ替えます。
そして、15行目のMTGetVarタグで、ハッシュの個々の要素の値を出力します。

また、1~12行目の処理で、ブログA/Bそれぞれから5件ずつの記事を読み込んでいるので、ハッシュには最大で10件の記事があります。
そこで、14行目のMTIfタグで、変数__counter__が5以下(=5回目の繰り返しまで)の時だけ記事を出力し、最新の5件の記事を出力しています。