MovableTypeにしても、WordPressにしても、「年度」(例えば4月始まり)という単位をそのまま扱うことはできません。
プラグインを入れてしまえば対応はできるのですが、依存しすぎるとバージョンアップ対応に苦労することもしばしばです。
そこで今回は、MovableTypeの標準の機能を組み合わせて、記事一覧を年度ごとに区切る方法をご紹介します。
サンプルとして下の画像のように記事を用意しました。
MovableTypeに標準で組み込まれている「MTArchiveList」を使うと、下の画像のように年ごとに区切ることができます。
1 2 3 4 5 6 7 8 |
<mt:ArchiveList type="Yearly" sort_order="dec"> <h3><mt:ArchiveDate format="%Y">年</h3> <ul> <mt:Entries> <li><time><$mt:EntryDate format="%Y.%m.%d"$></time><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a></li> </mt:Entries> </ul> </mt:ArchiveList> |
MTArchiveListのtypeモディファイアに「年度ごと」があれば話は早いのですが、そうもいかないので、創意工夫で下の画像のようにできました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<mt:SetVar name="current_biz_year" value="9999"> <mt:SetVar name="list_count" value="0"> <mt:Entries> <mt:SetVarBlock name="ent_year"><$mt:EntryDate format="%Y"$></mt:SetVarBlock> <mt:SetVarBlock name="ent_month"><MTEntryDate format="%m"></mt:SetVarBlock> <mt:If name="ent_month" lt="4"><mt:SetVar name="ent_year" op="dec"></mt:If> <mt:If name="ent_year" ne="$current_biz_year"> <mt:If name="list_count" ne="0"> </ul> </mt:If> <h3><MTVar name="ent_year">年度</h3> <ul> <mt:SetVar name="current_biz_year" value="$ent_year"> <mt:SetVar name="list_count" op="inc"> </mt:If> <li><time><$mt:EntryDate format="%Y.%m.%d"$></time><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle$></a></li> </mt:Entries> </ul> |
処理の流れが入り乱れてしまっているので、順を追って解説していきます。
まず前提として、出力されるHTMLは次のようになっています。
1 2 3 4 5 6 7 8 9 10 11 12 |
<h3>2016年度</h3> <ul> <li><time>2016.04.01</time><a href="#">2016年度の投稿①</a></li> </ul> <h3>2015年度</h3> <ul> <li><time>2016.03.31</time><a href="#">2015年度の投稿④</a></li> <li><time>2016.01.01</time><a href="#">2015年度の投稿③</a></li> <li><time>2015.12.31</time><a href="#">2015年度の投稿②</a></li> <li><time>2015.04.01</time><a href="#">2015年度の投稿①</a></li> </ul> |
処理には基本的に「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件の場合の処理を入れるべきでしょう。
これでようやく完成です。