MovableTypeで年-カテゴリ別のアーカイブリストを出力する方法

ものっすごい久しぶりにブログを更新しますよ!
久しぶりすぎて今までどういう感じで更新してたのか覚えてないくらいです。てか更新していない時期に転職もあって色々生活も変わったので報告的な話はいっぱいあるんですが、書いてるとそれだけで終わりそうなので無視していきなり本題です。

久々の更新はまさかのMovableTypeネタです。なんだかんだで今でも結構案件ありますよねーMTって。で、普通にできるだろうと思って作りかけてたものの、意外に嵌ってしまって苦労した箇所があり、結構使いそうな気がするのになぜか検索しても全然情報がないんだなーと思ったので自分で記録しておくことにしました。

タイトルの通り、年-カテゴリ別のリストを作りたかったんですよ。目指したかった形は以下のようなものです。

年-カテゴリ別のリストとはつまりこれ

<ul>
  <li><a href="2018年の年別アーカイブリンク先">2018年</a>
  <ul>
    <li><a href="2018年のカテゴリ1アーカイブリンク先">カテゴリ1</a></li>
    <li><a href="2018年のカテゴリ2アーカイブリンク先">カテゴリ2</a></li>
  </ul>
  </li>
  <li><a href="2017年の年別アーカイブリンク先">2017年</a>
  <ul>
    <li><a href="2017年のカテゴリ1アーカイブリンク先">カテゴリ1</a></li>
    <li><span>カテゴリ2</span></li>
  </ul>
  </li>
</ul>

便宜上、出力結果がわかりやすいように以下のような前提で説明していきます。
・2件のカテゴリがある。
・2018年にカテゴリ1とカテゴリ2の記事が1件ずつ、2017年にカテゴリ1の記事が1件だけある。
・別途、年別とカテゴリ-年別のテンプレートは作成済み。

まず、ArchiveList type=”Yearly”で回してみる

で、カテゴリ-年別は結構情報があるんですよ。以下のページとか。
カテゴリごとに年別アーカイブのリストを出力する (The blog of H.Fujimoto)
でもなぜか逆はないんだなー。でもまぁ似たような感じで書けばうまくいくだろうと思ってまず書いたのが以下のコード。

<ul>
<mt:ArchiveList type="Yearly">
<li><a href="<$mt:ArchiveLink encode_html="1"$>"><$mt:ArchiveTitle$></a>
<ul>
<mt:TopLevelCategories>
<mt:ArchiveList type="Category-Yearly">
<li><a href="<$mt:ArchiveLink encode_html="1"$>"><$mt:CategoryLabel$></a></li>
</mt:ArchiveList>
</mt:TopLevelCategories>
</ul>
</li>
</mt:ArchiveList>
</ul>

要するに、上記ページのコードの一段階上で「ArchiveList type=”Yearly”」でループを回してみたっていう感じですね。まぁでもこれは上手くいかなかったです。これで出力すると以下のような形になります。

<ul>
<li><a href="2018年の年別アーカイブリンク先">2018年</a>
<ul>
<li><a href="2018年のカテゴリ1アーカイブリンク先">カテゴリ1</a></li>
<li><a href="2017年のカテゴリ1アーカイブリンク先">カテゴリ1</a></li>
<li><a href="2018年のカテゴリ2アーカイブリンク先">カテゴリ2</a></li>
</ul>
</li>
<li><a href="2017年の年別アーカイブリンク先">2017年</a>
<ul>
<li><a href="2018年のカテゴリ1アーカイブリンク先">カテゴリ1</a></li>
<li><a href="2017年のカテゴリ1アーカイブリンク先">カテゴリ1</a></li>
<li><a href="2018年のカテゴリ2アーカイブリンク先">カテゴリ2</a></li>
</ul>

自分の感覚としてはTopLevelCategoriesのループで回している時にそのカテゴリのみのアーカイブを出力してくれるように、該当する年のものだけを出して欲しかったんですが、実際には他の年のアーカイブも出力されてしまいます。
ふーむ。どうしたものか。となるとまぁ以下のような感じでやることになりますね。

変数を使って該当する年を判別してみる

<ul>
<mt:ArchiveList type="Yearly">
<$mt:ArchiveTitle setvar="this_archive_year"$>
<li><a href="<$mt:ArchiveLink encode_html="1"$>"><$mt:ArchiveTitle$></a>
<ul>
<mt:TopLevelCategories>
<mt:ArchiveList type="Category-Yearly">
<$mt:ArchiveDate format="%Y&#24180;" setvar="archive_year"$>
<mt:If name="archive_year" eq="$this_archive_year">
<li><a href="<$mt:ArchiveLink encode_html="1"$>"><$mt:CategoryLabel$></a></li>
</mt:If>
</mt:ArchiveList>
</mt:TopLevelCategories>
</ul>
</li>
</mt:ArchiveList>
</ul>

つまり、まず”Yearly”でループを回す時にその年を変数に格納しておき、その後、”Category-Yearly”でのループの時にその年が変数内の年と一致していた時だけ出力する。
結果はこちら!

<ul>
<li><a href="2018年の年別アーカイブリンク先">2018年</a>
<ul>
<li><a href="2018年のカテゴリ1アーカイブリンク先">カテゴリ1</a></li>
<li><a href="2018年のカテゴリ2アーカイブリンク先">カテゴリ2</a></li>
</ul>
</li>
<li><a href="2017年の年別アーカイブリンク先">2017年</a>
<ul>
<li><a href="2017年のカテゴリ1アーカイブリンク先">カテゴリ1</a></li>
</ul>
</li>
</ul>

一応成功!

ちなみに結構重要な補足。
<$mt:ArchiveDate format="%Y&#24180;" setvar="archive_year"$>という部分ですが、このフォーマットを実体参照にしている点がポイントであって、これを”%Y年”としても動きません。ご注意を。

記事がない場合もカテゴリ名だけ出力させる

ここからはオプションみたいなものであって、上記の状態でも問題ないとは思いますが、一応当初の要件として記事(リンク先のページ)がないカテゴリもカテゴリ名だけ表示しておきたかったのでその時の対応方法もついでに載せておきます。

<ul>
<mt:ArchiveList type="Yearly">
<$mt:ArchiveTitle setvar="t_this_archive_year"$>
<li><a href="<$mt:ArchiveLink encode_html="1"$>"><$mt:ArchiveTitle$></a>
<ul>
<mt:TopLevelCategories>
<mt:Var name="has_archive" value="false">
<mt:ArchiveList type="Category-Yearly">
<$mt:ArchiveDate format="%Y年" setvar="t_archive_year"$>
<mt:If name="t_archive_year" eq="$t_this_archive_year">
<li><a href="<$mt:ArchiveLink encode_html="1"$>"><$mt:CategoryLabel$></a></li>
<mt:Var name="has_archive" value="true">
</mt:If>
</mt:ArchiveList>
<mt:If name="has_archive" eq="false">
<li><span><$mt:CategoryLabel$></span></li>
</mt:If>
</mt:TopLevelCategories>
</ul>
</li>
</mt:ArchiveList>
</ul>

変数has_archiveでフラグを用意し、リンクを出力した時(ArchiveListのループに含まれていない場合)にフラグを立てる。
フラグが立っていない場合だけspanタグで出力。
みたいな感じです。

というわけで一応できたー!けどもめんどくさくね、これ?なんか処理的にも無駄が多い気がするし!
てか本当にこれしかないのかな?実は俺が気づいてないだけで他にもっと簡単なやり方あったりするんだろうか。もし知ってる人いたら教えてください。
まぁ何が言いたいかというと、これがこの記事書いた一番の趣旨だったりもするんだけど、
「年-カテゴリ別」のリスト出力なんて別に普通にできるものだと思ってるかもしれないけど意外とそうでもない。
安請け合いする前にとりあえず情報がないかを検索してほしい。そしてこの記事を見つけたあなたは幸運である。
さぁ今のうちに、『「カテゴリ-年別」の方が遥かに簡単だからこっちでよくないですか?』と提案しよう。

こちらからは以上です。それでは。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


この投稿へのトラックバック

トラックバックはありません。

トラックバック URL