「~月の記事一覧」を出力する

昨日、MTQ以下のような質問が上がっていました。

アーカイブページでよくある「~月の記事一覧」ですが、 月や年を限定してインデックステンプレートで表示させることは可能でしょうか。
MTEntriesのモディファイアには月をダイレクトで指定するものがないようなので、こういったときは通常どういう方法で対応するのでしょうか。

MTEntriesタグには、日付をダイレクトに指定するモディファイアはありません。
しかし、MTArchiveListタグと組み合わせれば、一応は「~月の記事一覧」を出力することができます。
その方法を紹介します。

1.MTArchiveListタグとMTEntriesタグを組み合わせる

MTArchiveListタグはMovable Type標準のテンプレートタグで、名前の通りアーカイブのリストを出力するテンプレートタグです。
サイドバーに月別アーカイブの一覧を出力するような時に、このタグを使います。

MTArchiveListタグでは、archive_typeモディファイアを指定することで、アーカイブリストを出力するアーカイブのタイプを指定することができます。
また、lastnモディファイアで、出力するアーカイブの件数を指定することもできます。
例えば、以下のようにすると、最近6ヶ月間の月別アーカイブのリストを出力することができます。

<mt:ArchiveList archive_type="Monthly" lastn="6">
  アーカイブのタイトル等を出力する部分
</mt:ArchiveList>

また、MTArchiveListタグのブロックの中にMTEntriesタグのブロックを入れると、アーカイブ毎のブログ記事の一覧を出力することができます。
例えば、以下のようにタグを組むと、ブログ記事のタイトルのリストを、月ごとにまとめて出力することができます。

<mt:ArchiveList archive_type="Monthly">
  <ul>
  <mt:Entries>
    <li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a>(<$mt:EntryDate$>)</li>
  </mt:Entries>
  </ul>
</mt:ArchiveList>

2.月を限定する

上の例では、ブログ内のすべての月のブログ記事一覧が出力されます。
この例を書き換えて、特定の月のブログ記事一覧だけを出力するようにします。

MTArchiveListタグで月ごとのアーカイブを出力する場合、「MTArchiveDate」タグで、個々のアーカイブの月を得ることができます。
そこで、MTArchiveDateタグの値を調べて、出力したい月になっているときだけ、ブログ記事一覧を出力するようにします。

例えば、2010年1月のブログ記事の一覧を出力したいとします。
その実際のテンプレートを組むと、以下のようになります。

<mt:ArchiveList archive_type="Monthly">
  <$mt:ArchiveDate format="%Y%m" setvar="arc_month"$>
  <mt:If name="arc_month" eq="201001">
    <ul>
    <mt:Entries>
      <li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a>(<$mt:EntryDate$>)</li>
    </mt:Entries>
    </ul>
  </mt:If>
</mt:ArchiveList>

2行目のMTArchiveDateタグで、変数arc_monthにアーカイブの月を代入します。
「format="%Y%m"」のモディファイアを付けていますので、変数arc_monthには、西暦年4桁と月2桁を連結した値が入ります。
例えば、2010年1月のアーカイブを出力する場合だと、変数arc_monthの値は「201001」になります。

次に、3行目のMTIfタグで、変数arc_monthの値が、「201001」と等しいかどうかを調べます。
そして、等しい時だけ、MTIfタグのブロック内(=ブログ記事のリスト)が出力されます。

3.昨年同月のブログ記事の一覧を出力する

上の例を応用すると、「昨年同月のブログ記事の一覧を出力する」といったこともできます。
例えば、この記事は2010年9月に書いていますが、その場合に2009年9月のブログ記事一覧を出力するようなことができます。

現在の日付(正確には最後に再構築した日付)を得るには、「MTDate」というテンプレートタグを使います。
このテンプレートタグから現在の年と月を得て、年の値を-1すれば、昨年同月の年と月を得ることができます。
この値をMTArchiveDateタグの値と比較して、両者が一致しているときだけブログ記事を出力するようにすれば、昨年同月のブログ記事一覧を出力することができます。

実際にテンプレートを組むと、以下のようになります。

<$mt:Date format="%Y" setvar="year"$>
<$mt:SetVar name="year" op="--"$>
<$mt:Date format="%m" setvar="month"$>
<mt:SetVarBlock name="last_year_month"><$mt:GetVar name="year"$><$mt:GetVar name="month"$></mt:SetVarBlock>
<mt:ArchiveList archive_type="Monthly">
  <$mt:ArchiveDate format="%Y%m" setvar="arc_month"$>
  <mt:If name="arc_month" eq="$last_year_month">
    <ul>
    <mt:Entries>
      <li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a>(<$mt:EntryDate$>)</li>
    </mt:Entries>
    </ul>
  </mt:If>
</mt:ArchiveList>

1行目のMTDateタグで現在の年を変数yearに代入し、2行目のMTSetVarタグで変数yearの値を-1します。
「op="--"」は、変数の値を1減らすことを表すモディファイアです。
次に、3行目のMTDateタグで、現在の月を変数monthに代入します。
そして、4行目のMTSetVarBlockタグで、変数yearとmonthの値を連結して、変数last_year_monthに代入します。
ここまでの処理で、変数last_year_monthには、昨年同月の年月が「200909」のような形で代入されます。

リストの後半は、先ほどの例とほぼ同じです。
ただし、7行目のMTIfタグで、変数arc_monthの値と、変数last_year_month(=昨年同月の年月)の値とを比較するようにしています。
これによって、昨年同月のブログ記事一覧を出力することができます。

4.パフォーマンスの問題

ここまでで解説した方法で、一応は特定の年月のブログ記事一覧を出力することができます。
ただ、ブログ記事の数が多くなってくると、MTArchiveListタグの処理が重くなってくるため、パフォーマンス的に問題が出ることが考えられます。

拙作のSearchEntriesプラグインを使うと、さまざまな条件を指定してブログ記事を検索することができます。
特定年月のブログ記事を検索することも、もちろん可能です。
MTArchiveListタグを使う方法でパフォーマンス的に問題がある場合は、SearchEntriesプラグインを使うことをお勧めします。