top

カテゴリーアーカイブを年(月)で区切ったタイトルリストにする

080715.gif

MTの使い方は人それぞれだと思いますが、私のところではカテゴリーアーカイブはタイトルのみの一覧にしていることが多いです。

一目で記事が見渡せるので自分的には好きな方法なのですが、タイトルがズラッと並んでいるだけでは、いつの出来事なのかパッと見分かりにくいので、日記系のカテゴリでは年ごとに区切りをつけて使っています。


単に年(月)ごとに区切ればいいだけなら、以下の方法で簡単に出来ます。↓

<MTArchiveList archive_type="Yearly">
<MTEntries lastn="0" category="カテゴリ名">
<MTEntriesHeader><$MTEntryDate format="%Y"$>年<ul></MTEntriesHeader>
<li><a href="<$MTEntryLink$>"><$MTEntryTitle$></a></li>
<MTEntriesFooter></ul></MTEntriesFooter>
</MTEntries>
</MTArchiveList>

しかしこの方法では記事単位で頁分割することができないんですよね。タイトルのみのリストでも増えてくると、50記事単位くらいで分割したいなと思うようになってきます。ということで、今後に備えてArchiveListは使わず、MTEntriesだけで年ごとに区切れる方法を覚え書き。

■ 基本:原理
MTEntriesだけで年ごとに区切る一番簡単な方法。%Yを%Y%mにすれば月ごとの区切りになります。

<MTEntries>
<MTSetVarBlock name="thisyear"><$MTEntryDate format="%Y"$></MTSetVarBlock>
<MTUnless name="year" eq="$thisyear">
<$MTGetVar name="thisyear"$>年<br />
<MTSetVarBlock name="year"><$MTGetVar name="thisyear"$></MTSetVarBlock>
</MTUnless>
<a href="<$MTEntryLink$>"><$MTEntryTitle$></a><br />
</MTEntries>

まず記事の年を求めます。最初のループでは変数yearがまだ空なのでMTUnlessの条件が成立せず年見出しが出ます。その後yearに今の年を設定。その後は年が変わるまで変数yearと記事の年が一致するので、記事タイトルのみが出力され、年が変わった最初の1回にまた年見出しが出力されてその後は年が変わるまで記事タイトルのみ出続けて…を繰り返します。
マークアップにこだわりがなければこのままでも使えると思います。

■ 本題:カテゴリーアーカイブを年(月)で区切ったタイトルリストにする
<ul><li>を組み込んだ方法。リストのループを作るためやや複雑になりますが、原理は上と同じです。マークアップはお好みで。

<MTSetVarBlock name="fyear"><MTEntries lastn="1"><$MTEntryDate format="%Y"$></MTEntries></MTSetVarBlock>

<MTEntries lastn="0">
<MTSetVarBlock name="thisyear"><$MTEntryDate format="%Y"$></MTSetVarBlock>

<MTUnless name="year" eq="$thisyear">
<MTIf name="fyear" ne="$thisyear"></ul></MTIf>
<$MTGetVar name="thisyear"$>年<ul>
<MTSetVarBlock name="year"><$MTGetVar name="thisyear"$></MTSetVarBlock>
</MTUnless>

<li><a href="<$MTEntryLink$>"><$MTEntryTitle$></a></li>

<MTEntriesFooter></ul></MTEntriesFooter>
</MTEntries>

4.2以降ならlastn="0"は要らないです。4.0~4.1はダイナミックだとカテゴリの記事数が管理画面で設定された数になってしまうのでlastn="0"必須です(数字は0でなくても9999などでも可)。
%Y%Y%mにすれば月ごとの区切りになります(月ごとの場合は見出しタイトルは<$MTEntryDate format="%Y年%B月"$>などにすると良し)。
静的・動的、両方で同じ動きになることを確認しています。