MovableTypeで、記事一覧を「年度」ごとに区切る

MovableTypeにしても、WordPressにしても、「年度」(例えば4月始まり)という単位をそのまま扱うことはできません。
プラグインを入れてしまえば対応はできるのですが、依存しすぎるとバージョンアップ対応に苦労することもしばしばです。
そこで今回は、MovableTypeの標準の機能を組み合わせて、記事一覧を年度ごとに区切る方法をご紹介します。


サンプルとして下の画像のように記事を用意しました。

MovableTypeに標準で組み込まれている「MTArchiveList」を使うと、下の画像のように年ごとに区切ることができます。

MTArchiveListのtypeモディファイアに「年度ごと」があれば話は早いのですが、そうもいかないので、創意工夫で下の画像のようにできました。

処理の流れが入り乱れてしまっているので、順を追って解説していきます。
まず前提として、出力されるHTMLは次のようになっています。

処理には基本的に「MTEntries」のループを使用します。
記事の属すべき年度の見出しがまだ出力されていなかったら(=その記事が、その年度の最初のものだったら)、見出しと<ul>の開始タグを出力してから<li>要素を追加します。
そうでなかった場合、単に<li>要素を追加します。

年度見出しが出力されているかどうかの判定は、「current_biz_year」という変数で行うことにし、初期値として9999を与えておきます。
一番最初の記事には必ず見出しが付くためです。
(※ 西暦9999年まで運用が続いた場合はバグるので注意してください。)

次に、記事が属すべき年度の判定ですが、「MTEntryDate」で「公開年」と「公開月」をそれぞれ取得しておき、公開月が3月以前であれば公開年をデクリメントして「公開年度」に変換します。
「公開年度」と「current_biz_year」を比較して一致していなければ、その年度の見出しはまだ出力されていないと判断できます。
見出しを出力したら「current_biz_year」を更新して同一年度の見出しが出力されないようにしておきます。

概ねこれで良いのですが、このままでは<ul>要素が開きっぱなしになってしまうので、閉じる方法を考えます。
手っ取り早いのは、年度見出しを出力する際に一緒にしてしまうことですが、一番最初の年度見出しには不要です。
そこで「list_count」という変数を作って、判定することにしました。
8行目から10行目で</ul>を出力しているのはこのためです。
また、一番最後の</ul>は見出しに紐付かないので、MTEntriesのループ外に静的に置いてしまいます。
より丁寧にやるのであれば「MTEntriesCount」で表示記事が0件の場合の処理を入れるべきでしょう。

これでようやく完成です。

●この記事を書いた人