【メモ】MTでカテゴリー+年度別アーカイブを出力する

20110323.jpg

先月リリースしたサイトで、お知らせ記事のサイドバーに、年度別アーカイブへのリンクを貼って欲しいとリクエストされたので、1ヵ月ぐらいずっと方法を調べていたのですが、やっと今日わかりました。

最終的には、今日検索していて見つけた「【MT5/Movabletype5】 Movabletype5で制作を行っているのですが.. - 人力検索はてな」のページのコードを使いました。ありがとうございます。

年度別アーカイブを出力するプラグイン

年度別アーカイブを出力するプラグインは2つあります。

FiscalYearlyArchivesプラグインのほうは、全部のカテゴリをまとめたページが出力されるので、今回はアーカイブ拡張プラグインを使いました。

その記事が所属するカテゴリーの年度別アーカイブリストを出力する

今回やりたいことは、カテゴリー別記事一覧ページと、個別エントリーページのサイドバーに、その記事が所属するエントリーの、年度別アーカイブのページへ、リンクを貼ることです。

いろいろ検索してみると、「年度別の記事リストを出力」「年度別アーカイブをさらに月別に分ける」というのはたくさん見つかったのですが、そこまで細かくなくて良いのです。

カテゴリー別記事一覧ページに書いたコード

アーカイブ拡張プラグインのサンプルコードを見ながら、同じように記述して、タイトルの後ろに記事の件数を入れるようにしました。

<mt:ArchiveList archive_type="Category-FiscalYearly">
<mt:ArchiveListHeader>
<ul>
</mt:ArchiveListHeader>
<li><a href="<$mt:ArchiveLinkmce_markergt;"><$mt:ArchiveFiscalDate format="%Y年度"> (<$mt:ArchiveCountmce_markergt;)</a></li>
<mt:ArchiveListFooter>
</ul>
</mt:ArchiveListFooter>
</mt:ArchiveList>

<mt:ArchiveList archive_type="Category-FiscalYearly">
<mt:ArchiveListHeader>
<ul>
</mt:ArchiveListHeader>
<li><a href="<$mt:ArchiveLink$>"><$mt:ArchiveFiscalDate format="%Y年度"> (<$mt:ArchiveCount$>)</a></li>
<mt:ArchiveListFooter>
</ul>
</mt:ArchiveListFooter>
</mt:ArchiveList>

アーカイブタイプの”Category-FiscalYearly”は、アーカイブ拡張プラグインで提供され、年度別+カテゴリー別のアーカイブを出力します。
同じくデータフォーマットの”%Y年度”は、該当年度のラベルになります。これは指定した方が便利です。使用例がこちらのページに記載されています。 

個別エントリーアーカイブへの実装方法

さて、上と同じコードを個別エントリーアーカイブに入れると、意図した通りに出力されませんでした。恐らく、個別エントリーアーカイブのページは、特定のカテゴリ以下に入らないケースがあるからではないかと思うのですが‥複数カテゴリに所属しているとか、そんなケースがあり得るので、うまく出力されなかったのではと推測しています。

そこで、はてなの質問ページにあったコードと同じ内容のモジュールを作成して、テンプレートの中に入れてみました。

<MTIf tag="EntryCategory">
<MTSetVarBlock name="e_cat">
<mt:EntryCategories glue=','<$mt:CategoryLabel$></mt:EntryCategories>
</MTSetVarBlock>
</MTIf>
<MTUnless name="e_cat">
<MTElse>
<mt:IfArchiveTypeEnabled archive_type="Category-FiscalYearly"><mt:ArchiveList archive_type="Category-FiscalYearly">
<mt:ArchiveListHeader>
<ul>
</mt:ArchiveListHeader>
<MTSetVarBlock name="c_name"><$mt:ArchiveTitle$></MTSetVarBlock><MTSetVarBlock name="c_name2"><$MTVar name="c_name"regex_replace="/:.+/",""$></MTSetVarBlock>
<MTIf test="$e_cat =~ $c_name2">
<li><a ="<$mt:ArchiveLink$>"><$mt:ArchiveFiscalDate format="%Y年度"
</a> (<$mt:ArchiveCount$>)</li>
</MTIf>
<mt:ArchiveListFooter>
</ul>
</mt:ArchiveListFooter>
</mt:ArchiveList>
</mt:IfArchiveTypeEnabled>
</MTUnless>

元のコードでは、Category-Yearly となっているところを、プラグインを使って年度別アーカイブにリンクさせるために、Category-FiscalYearlyと書き換えてあります。

このコードでウィジェットテンプレートを作成し、個別エントリーアーカイブのページに

<$mt:Include widget="属するカテゴリの年別アーカイブ"$>

として入れてみると、思った通りの表示になりました。
や、やっとできた‥‥! 

悩んだところ

この方法だと、

  • カテゴリーアーカイブ
  • 個別エントリーアーカイブ

で、それぞれ違うコードを用意しないといけないのですが、やっぱりテンプレートの種類が違うから、全部のテンプレートで同じコードを使うことはできないんでしょうかね。

例えば、「サイドバー」というテンプレートモジュールを作っておいて、その中で

  • カテゴリーアーカイブの時はAのコードを出力
  • 個別エントリーアーカイブの時は、Bのコードを出力

という条件分岐を入れておけばいいのでしょうか(処理が遅くならないのかな)。

でも、何とかクリアできたのでホッとしました。
このコードはスニペットに入れておこうと思います。それにしても、WordPressの場合はどうやって解決すればいいんだろう?

このエントリーをはてなブックマークに追加
SAPPORO ART MIX 2011 LIVE@札幌芸術の森
今週のまとめ(2011-3-27)