複数ブログの記事を年ごとに区切って出力

MTQに、「複数ブログの記事を年ごとに区切って出力したい」といった内容の質問がありました。
この質問に答えます。

考え方

質問された方は、MTMultiBlogタグの中で、MTArchiveListタグで年ごとに区切ることを考えられていました。
しかし、MTArchiveListタグはMultiBlogには対応していないので、正しい出力になりません。

そこで、MTEntriesタグで記事を出力しつつ、年ごとに区切るようにします。
ただ、MTEntriesタグのブロック内で、年の最初や最後の記事を判断するテンプレートタグはないので、この処理を自力で組みます。
前の記事と年が変わったかどうかを判断して、前の記事の年の最後の記事の後に出力したい部分と、今の記事の前に出力したい部分を、順に出力するという流れを取ります。

質問された方の希望は、各年の記事をul/liのリスト出力し、年の先頭の記事ではulの前に年を出力するというものでした。
そこで、前の記事の年と変わったところで、前の年の記事の最後の後の</ul>と、この記事の年の前の<ul>→年を出力します。

テンプレートの例

前の記事の年と、現在の記事の値を、それぞれlast_year/cur_yearという変数で扱うとすると、以下のようにテンプレートを組みます。

<$mt:SetVar name="last_year" value="0"$>
<mt:Entries include_blogs="各ブログのIDのリスト">
  <mt:EntryDate format="%Y" setvar="cur_year"$>
  <mt:If name="cur_year" ne="$last_year">
    <mt:EntriesHeader><mt:Else></ul></mt:EntriesHeader>
    <p><$mt:GetVar name="cur_year"$>年</p>
    <ul>
  </mt:If>
  <li><$mt:EntryTitle$></li>
  <$mt:SetVar name="last_year" value="$cur_year"$>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

4行目で、現在の記事の年(変数cur_year)と、前の記事の年(変数last_year)を比較し、両者が異なれば(=年が変わっていれば)、前の年の記事の最後の後の</ul>と、この記事の年の前の<ul>→年を出力します。
ただ、最初の記事の時点でも、last_yearとcur_yearの値は異なるので、年が変わったという判断になります。

しかし、最初の記事の前に</ul>を出力するのは正しくありません。
そこで、5行目のMTEntriesHeaderタグとMTElseタグで、最初の記事でない時だけ、</ul>を出力します。

そして、記事を出力した後、10行目のMTSetVarタグで変数last_yearに変数cur_yearの値を代入します。
これで、次の記事を出力する際に、年を比較することができます。