月別アーカイブが増えてくると縦にずらーっと長く並んで場所をとるので、もっとコンパクトに整理したいと思うことはありませんか。従来それによく使われてきたのがArchiveDateHeaderプラグインです。これを使うと以下のように書いて
<MTArchiveList archive_type="Monthly">
<MTArchiveDateHeader>
<br /><MTArchiveDate format="%Y">年:
</MTArchiveDateHeader>
<a href="<$MTArchiveLink$>"><MTArchiveDate format="%B">月</a>
</MTArchiveList>
以下のようにコンパクト化できます。
2007年:6月 5月 4月 3月 2月 1月
2006年:12月 11月 10月 9月 8月 7月 6月 5月 4月 3月 2月 1月
<li></li>が使えるように ArchiveDateFooterプラグインと組みわせてマークアップすることもできます。
この方法の問題点
ただしこの方法には限界がありました。月アーカイブを年ごとに区切っているだけなので、月部分が1月から始まらずに12月(投稿のある最新月)から始まってしまうのです。かといって<MTArchiveList archive_type="Monthly" sort_order="ascend">のようにsort_order="ascend"をつけて昇順にすると全体も昇順になってしまって、以下のように年の並びまで昇順になってしまうのです。
2006年:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2007年:1月 2月 3月 4月 5月 6月
正直これではあまり見やすいとは言えません
。ここはやっぱり年は降順、月は昇順になってくれるのが感覚的に分かりやすく見やすい。それを解決してくれていたのがArchiveYearプラグインとArchiveLoadプラグインでした。ArchiveDateHeaderプラグインとこの2つを組み合わせることで、以下のように年は降順、月は昇順に出来ていたのです。
2007年:1月 2月 3月 4月 5月 6月
2006年:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
MT4の問題点
ところがMT4でArchiveYearプラグインとArchiveLoadプラグインが上手く動作しなくなりました。それでしかたなく暫定的にCompareプラグインを使って年を降順、月を昇順にしていたのですが、せっかくMT4になったのだから新しいタグを使ってMTタグだけでこのようなことが出来ないものかと考えていました。試行錯誤の結果、ついにMTタグだけで年を降順・月を昇順にすることが出来たのでここに覚え書きです。
追記:
4.0では年アーカイブに月アーカイブを入れ子にした場合、全ての月リストが出力されていたので、変数を使って「その年に属する月」を求める必要がありました。が、4.1からは年アーカイブに月アーカイブを入れ子にした場合「その年に属する月」のみ出力されるように改善されたので、より簡単に目的のことが出来るようになりました。そのため4.0用、4.1以降用に分けて解説を行うように修正しました。(2008.9.18)
■本題1:MT4で年を降順・月を昇順にして月アーカイブをコンパクト化する(4.0用)
これにはMT4から加わった年アーカイブを使います。アトリビュートに変数が使えるようになったのに目を付けて、年アーカイブから<MTSetVarBlock>で変数(年)を取得し、<MTIf>のアトリビュートeq="xxxx"を使ってその年に所属する月のみを表示させるようにしました。以下、タグの書き方。
<MTArchiveList archive_type="Yearly">
<MTSetVarBlock name="year"><$MTArchiveDate format="%Y" language="en"$></MTSetVarBlock>
<$MTArchiveDate format="%Y" language="en"$>年:
<MTArchiveList archive_type="Monthly" sort_order="ascend">
<MTSetVarBlock name="year2"><$MTArchiveDate format="%Y" language="en"$></MTSetVarBlock>
<MTIf name="year2" eq="$year">
<a href="<$MTArchiveLink$>"><$MTArchiveDate format="%B"$>月</a>
</MTIf>
</MTArchiveList><br />
</MTArchiveList>
さらに<MTArchiveListHeader>と<MTArchiveListFooter>を加えれば<li>や<dt><dd>なども使えるようになるのでより細かい調整やマークアップが出来るようになると思います。以下は定義リスト化してみた場合。
<dl>
<MTArchiveList archive_type="Yearly">
<MTSetVarBlock name="year"><$MTArchiveDate format="%Y" language="en"$></MTSetVarBlock>
<dt><$MTArchiveDate format="%Y" language="en"$>年:</dt>
<MTArchiveList archive_type="Monthly" sort_order="ascend">
<MTSetVarBlock name="year2"><$MTArchiveDate format="%Y" language="en"$></MTSetVarBlock>
<MTArchiveListHeader><dd></MTArchiveListHeader>
<MTIf name="year2" eq="$year">
<a href="<$MTArchiveLink$>"><$MTArchiveDate format="%B"$>月</a>
</MTIf>
<MTArchiveListFooter></dd></MTArchiveListFooter>
</MTArchiveList>
</MTArchiveList>
</dl>
これだと以下のような感じになります。
- 2007年:
- 1月 2月 3月 4月 5月 6月
- 2006年:
- 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
全てMTタグのみで実装しており、プラグインは1つも使用していません。もちろん静的・動的どちらでも問題なく使えます。しかもCompareプラグインの機能までMTタグで実現できるなんて、MT4最高~(笑)。
アップグレードしてよかったです。^^
■本題2:年を降順・月を昇順にして月アーカイブをコンパクト化する(4.1~)
4.1からは年アーカイブの中での月リストは「その年に属する月」のみ出力するようになったので、より簡単に「年を降順・月を昇順にして月アーカイブをコンパクト化」が出来るようになりました。4.1以降はこちらの方法をおすすめします。
<dl>
<MTArchiveList archive_type="Yearly">
<dt><$MTArchiveDate format="%Y"$>年:</dt>
<MTArchiveList archive_type="Monthly" sort_order="ascend">
<MTArchiveListHeader><dd></MTArchiveListHeader>
<a href="<$MTArchiveLink$>"><$MTArchiveDate format="%B"$>月</a>
<MTArchiveListFooter></dd></MTArchiveListFooter>
</MTArchiveList>
</MTArchiveList>
</dl>
【補足説明】
4.0のダイナミックではMTArchiveDate format="%Y"にlanguage="en"を指定しないと正しく出力されないバグがありました。そのため、4.0用ではlanguage="en"を指定していますが、4.1以降はそのバグは修正されたのでlanguage="en"は省いてあります。
<注>4.2以降でこのカスタマイズを使うためには年アーカイブを作成しておく必要があります(4.1以前は年アーカイブなしでも動作していましたが、4.2以降は年アーカイブが作成されていないと動作しません)。年アーカイブを使う予定がない場合はダミー用年アーカイブを作って再構築オプションを「手動」または「公開しない」にしておきます。年アーカイブを作成したくない場合は、月リストだけで年見出しを出すカスタマイズをご利用下さい。
<2008.8.20 追記>注意書きを追加。
<2008.9.18 追記>4.1から年リストに月リストを入れ子にした場合の挙動が変更されていた(sixapartに確認して判明)ので、それに合わせて4.1以降用の記述も追記。