複数カテゴリを合算したカテゴリ月別アーカイブを出力する

MTQに、「複数カテゴリを合算したカテゴリ月別アーカイブを出力したい」といった内容の質問がありました。
この質問に答えます。

1.ご質問の概要

ご質問の概要は、以下のような構造のカテゴリがあるときに、各店のスタッフブログをまとめて、月別アーカイブリストを出力したいといったものです。

■店舗一覧
└■○○店
 └■○○店スタッフブログ
 └■○○店スタッフ紹介
└■△△店
 └■△△店スタッフブログ
 └■△△店スタッフ紹介
└■...

たとえば、2012年11月に、○○店/△△店のスタッフブログの記事数がそれぞれ10/15だとすると、「2012年11月(25)」のように、各月の合計の記事数をアーカイブリストに出力します。

2.考え方

Movbale Typeの標準のテンプレートタグでは、カテゴリをまたがって月別アーカイブを出力するような機能はありません。
ただ、ハッシュを活用し、各カテゴリの記事数を合計すれば、希望のようなことを行うことができます。

たとえば、○○店/△△店のスタッフブログの月ごとの記事数が以下のようになっているとします。

○○店△△店合計
2012年11月101525
2012年10月121123
2012年9月111324

この場合、以下のようなハッシュを作ります。

キー
2012110100000025
2012100100000023
2012090100000024

ハッシュのキーには、各月の先頭の日時を、「20121101000000」のように「年月日8桁+0時0分0秒(0が6つ)」という14桁の文字列にしたものを使います。
このようにしておくと、キーで並べ替えることで、月の順にハッシュの内容を出力することができます。
また、MTDateタグを使って、「2012年11月」のような形式に変換して出力することもできます。

一方、ハッシュの値には、各月のブログ記事数を保存します。
カテゴリ月別アーカイブを順に調べ、記事数を合計したいカテゴリのときだけ、ハッシュに値を足すようにします。

3.テンプレート

実際にテンプレートを組むと、以下のようになります。
前述のハッシュに、「counts」という名前を付けるものとしています。

<mt:ArchiveList archive_type="Category-Monthly">
  <mt:If tag="CategoryLabel" like="○○店スタッフブログ|△△店スタッフブログ">
    <$mt:ArchiveDate format="%Y%m%d%H%M%S" setvar="key"$>
    <$mt:ArchiveCount setvar="count"$>
    <mt:SetVar name="counts{$key}" op="+" value="$count"$>
  </mt:If>
</mt:ArchiveList>
<mt:Loop name="counts" sort_by="key reverse">
  <mt:If name="__first__"><ul></mt:If>
  <li><$mt:Date ts="$__key__" format="%Y年%m月"$>(<$mt:GetVar name="__value__"$>)
  <mt:If name="__last__"></ul></mt:If>
</mt:Loop>

3-1.前半

前半の1~7行目は、カテゴリ月別アーカイブリストを順に調べて、○○店/△△店スタッフブログのときに、ハッシュcountsを作る処理です。
2行目のMTIfタグで、カテゴリ名が「○○店スタッフブログ」か「△△店スタッフブログ」のときだけ、ハッシュを作るようにします。
3行目では、MTArchiveDateタグ(アーカイブの先頭日の日付)を、前述の14桁の文字列に変換し、変数keyに代入します。
4行目では、アーカイブの記事数を変数countに代入します。
そして5行目では、ハッシュcountsの中で、キーが変数key(年月日時分秒の14桁の文字列)になっている要素に、変数countの値(アーカイブの記事数)を足します。

3-2.後半

後半の8行目以降は、ハッシュを順に出力する処理です。
まず、8行目のMTLoopタグで、ハッシュcountsをキーの逆順(=アーカイブの日付の新しい順)に並べ替えます。
9行目/11行目で、繰り返しの最初と最後に、<ul>/</ul>タグを出力します。
そして10行目で、ハッシュのキー(変数keyの値)を「○年□月」の形に変換して出力し、またハッシュの値(各月のブログ記事数)も出力します。

4.ハッシュは必須

Movable Type 5.1 Webサイト製作ガイドVolume 2この例のように、手の込んだ処理をしようとすると、ハッシュを避けて通ることができません。
拙著「Movable Type 5.1 Webサイト製作ガイドVolume 2」では、ハッシュについて、かなり詳しく解説しています。
「ハッシュがよく分からない」という方は、ぜひ拙著をお読みください。

MT Cloud Starter Kit
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください