カテゴリを記事が投稿された順に表示する(その2)

昨日の記事の続きで、カテゴリの一覧を、記事が投稿された順に表示する方法を解説します。

1.考え方

昨日、ハッシュの使い方を解説しました。
その中で、MTLoopタグを使って、ハッシュの各要素をキーや値で並べ替えて出力する方法を紹介しました。
カテゴリを、記事が投稿された順に出力する場合も、このテクニックを利用します。

以下のようなハッシュを考えてみてください。

  • キー = 各カテゴリの最新記事の日付
  • 値 = 各カテゴリの最新記事へのリンク

このハッシュを、キーの逆順で並べ替えます。
キーは各カテゴリの最新記事の日付ですので、その逆順で並べ替えると、新しく記事が投稿されたカテゴリから順に出力されることになります。
これで、ハッシュの各要素の値を順に出力すれば、記事の投稿順にカテゴリを出力できます。

2.ハッシュを作る

上の考え方に沿って、まずはハッシュを作る処理を書きます。
ここでは、カテゴリのリストを以下のように出力するものとします。

<ul>
  <li><a href="カテゴリAのアーカイブへのリンク">カテゴリAの名前</a>
  <ul>
    <li><a href="カテゴリAの最新記事へのリンク">カテゴリAの最新記事のタイトル</a></li>
  </ul>
  </li>
  <li><a href="カテゴリBのアーカイブへのリンク">カテゴリBの名前</a>
  <ul>
    <li><a href="カテゴリBの最新記事へのリンク">カテゴリBの最新記事のタイトル</a></li>
  </ul>
  </li>
  ・・・
</ul>

ハッシュを作るためのテンプレートタグの組み方は、以下のようになります。

<mt:Categories>
  <mt:Entries lastn="1" sort_order="descend">
    <mt:SetVarBlock name="entry_date"><mt:EntryDate format="%Y%m%d%H%M%S"><mt:CategoryId sprintf="%06d"></mt:SetVarBlock>
    <mt:SetVarBlock name="catlist" key="$entry_date">
      <li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
      <ul>
        <li><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a>(<$mt:EntryDate$>)</li>
      </ul>
      </li>
    </mt:SetVarBlock>
  </mt:Entries>
</mt:Categories>

各行の内容は以下の通りです。

内容
1/12カテゴリを順に出力します。
2/11各カテゴリの最新の記事を1件出力します。
3最新記事の日付と、カテゴリのIDを組み合わせた値を、「entry_date」という変数に代入します。
この値を、ハッシュのキーとして使います。
4~10変数entry_dateの値がキー、カテゴリの最新記事へのリンクが値となるように、「catlist」という名前のハッシュに要素を追加します。

3.ハッシュを出力する

ここまででハッシュができました。
次に、ハッシュを日付の逆順で並べ替えて出力します。
そのタグの組み方は、以下のようになります。

<mt:Loop name="catlist" sort_by="key reverse">
  <mt:If name="__first__"><ul></mt:If>
  <mt:GetVar name="__value__" setvar="tmp">
  <mt:If name="__counter__" le="3">
    <$mt:GetVar name="tmp"$>
  </mt:If>
  <mt:If name="__last__"></ul></mt:If>
</mt:Loop>

各行の内容は以下の通りです。

内容
1/8ハッシュの各要素を、キー(各カテゴリの最新記事の日付)の逆順で順に出力します。
2ハッシュの先頭の要素のときに、リスト全体を囲む<ul>タグを出力します。
3ハッシュの値(変数__value__)を、「tmp」という変数に保管しておきます(このあとのMTIfタグのブロック内では、変数__value__の値が書き変わってしまうため)。
4~6変数__counter__の値が3以下の場合のみ、変数tmpの値(=ハッシュのキーの値)を出力します。
変数__counter__は繰り返しが行われた回数を表す変数です。
7ハッシュの最後の要素のときに、リスト全体を囲む</ul>タグを出力します。