top

エントリーアーカイブに同じカテゴリの記事一覧を表示する(3) 4.0~MTタグ編

3.3以前のMTではMTタグのアトリビュート(4ではモディファイアというみたいですね)に変数が使えませんでした。そのためアトリビュート(モディファイア)に変数を使いたい場合はプラグインやSmartyで工夫する必要がありました。が、4.0からはアトリビュートに変数が使えるようになったため、MTタグのみで<MTEntries category="<$MTEntryCategory$>">みたいなことが出来るようになりました。「エントリーアーカイブに同じカテゴリの記事一覧を表示する」カスタマイズを例にとってその方法を覚え書き。

面白いのは、4.0から実装されたこの方法がSmartyによる方法とほとんど同じことです。4.0でダイナミックで使えなくなった

{{capture assign="name"}}<$MTEntryCategory$>{{/capture}}
<MTEntries lastn="10" category="$name">

の{{capture assign="name"}}部分ががそっくりそのまま<MTSetVarBlock name="name">タグで置き換わったかのようです。この方法はダイナミックだけでなく静的生成でも使えますから静的頁の可能性も4.0により広がったと言えると思います。

■エントリーの属するカテゴリーの記事を表示させる
そのエントリーの属するカテゴリーの記事のみが表示されます。赤字の部分は好きな名前でかまいませんが、2箇所とも同じ名前にしておく必要があります。lastn="10"の中の数字は表示させたい件数を。

<MTSetVarBlock name="ecat"><$MTEntryCategory$></MTSetVarBlock>
<MTIf name="ecat">
<ul>
<MTEntries lastn="10" category="$ecat">
<li>
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>
</li>
</MTEntries>
</ul>
</MTIf>

■サブカテゴリー以下の記事も表示させる
そのエントリーの属するカテゴリの下にさらにサブカテゴリーがあり、サブカテゴリーの記事も一緒に表示させたい場合。赤字の部分は好きな名前でかまいませんが、2箇所とも同じ名前にしておく必要があります。lastn="10"の中の数字は表示させたい件数を。

<MTSetVarBlock name="ecat"><$MTEntryCategory$></MTSetVarBlock>
<MTIf name="ecat">
<ul>
<MTEntriesWithSubCategories lastn="10" category="$ecat">
<li>
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>
</li>
</MTEntriesWithSubCategories>
</ul>
</MTIf>

応用:エントリーの属する全てのカテゴリーの記事を表示させる
エントリーに複数カテゴリが指定してある場合、その全てのカテゴリーに属する記事を表示させることも出来ます。

<MTSetVarBlock name="ecat"><MTEntryCategories glue=" OR "><$MTCategoryLabel$></MTEntryCategories></MTSetVarBlock>
<MTIf name="ecat">
<ul>
<MTEntries lastn="10" category="$ecat">
<li>
<a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a>
</li>
</MTEntries>
</ul>
</MTIf>

ただ、この方法ではカテゴリー毎にまとまらずまぜこぜになって表示されるので、カテゴリー毎に分けて表示したい場合はこちらの方法を使うといいと思います。

<注意>
・MT4.0以降専用カスタマイズです。3.3以前では使えませんのでご注意下さい。

<2007.9.8 追記>
複数カテゴリの記事を全て表示することも出来たことに気付いたので追記。
<2008.9.8>
カテゴリーに属さない記事ではリストを表示しないよう修正(エラー回避のため)。

月別アーカイブを年毎に区切ってみる(3) 4.0完成版

月別アーカイブが増えてくると縦にずらーっと長く並んで場所をとるので、もっとコンパクトに整理したいと思うことはありませんか。従来それによく使われてきたのが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以降用の記述も追記。