Movable Typeを利用した案件で、例えば博物館や公園のWebサイトで今日以降のイベントはインデックスに、昨日以前...つまり終了したイベントは月別アーカイブに出したい、というような要件が出ました。インデックスについては3月に書いた「MTで公開日が現在から最も近い未来の記事を表示する」で紹介した「EntryAuthoredonFilterプラグイン」を使えば解決しますが、月別アーカイブで昨日以前の記事を出力するにはどのようにしたらよいでしょうか。
EntryAuthoredonFilterは使えなかった
まずEntryAuthoredonFilterプラグインを使ってみたのですが、昨日以前の記事を出力することができませんでした。調べてみると、MTEntries
の処理をする際、アーカイブテンプレートである場合は処理が分岐してdated_group_entries
サブルーチンが呼ばれ、月初〜月末が記事抽出条件にセットされるようになっているためです。authored_on_filter
の値は無視されます。
MTIfで分岐しても良いけど
よく考えるとプラグインを使わずともMTIf
で分岐を入れ、MTEntryDate
が昨日以前の場合は出力するようにすれば実現はできそうです。ただ、1記事毎に日付を比較するのは非常に無駄な印象があります。記事は日付順になっているので一度「出力する」と判定すれば、以降のループでは判定を省略することもできそうですが、テンプレートがややこしくなりそう。
それだけでなく、MTEntriesHeader
のようなタグは使えなくなりそうですし、「PageButeプラグイン」も上手く動作しないです。(今回はページ分割はしないのですが、将来的なことも考えて。)
やはりプラグインで
そのようなわけで、藤本さんの「Movable Type Developer's Guide」等を参考にしながら「ArchivedEntriesプラグイン(仮称)」を書いてみました。
内容はいたって基礎的なもので、記事を呼び出す部分はMovable Type Developer's Guideのサンプルコードやdated_group_entries
サブルーチンとほぼ同等の内容です。最後の部分で次のようなコード使用し、既存のMTEntries
タグの処理を流用することができました。stash
に入れた記事データを使用するので、dated_group_entries
サブルーチンが呼ばれることはありませんでした。
local $ctx-> = \@entries;
return $ctx->invoke_handler('entries', $args, $cond);
ちなみに、書籍にはreturn $ctx->_hdlr_entries()
とあったのですが、return $ctx->invoke_handler()
でないと動きませんでした。
テンプレートは次のようになりました。当月と前月の共通部分をMTSetVarTemplate
でまとめることができてシンプルになりましたし、PageButeプラグインを使った場合も意図通り記事が出力されました。
<$mt:Date format="%Y%b" setvar="tmp__today"$>
<$mt:ArchiveTitle regex_replace="/(\d+)年(\d+)月/","$1$2" setvar="tmp__archive_month"$>
<mt:SetVarTemplate name="tmpl__entry_list">
<mt:EntriesHeader><ul></mt:EntriesHeader>
<li><$mt:EntryTitle$></li>
<mt:EntriesFooter></ul></mt:EntriesFooter>
</mt:SetVarTemplate>
<mt:If name="tmp__archive_month" eq="$tmp__today">
<mt:Ignore>当月昨日以前の月別アーカイブ</mt:Ignore>
<mt:ArchivedEntries>
<$mt:Var name="tmpl__entry_list">
</mt:ArchivedEntries>
<mt:Else>
<mt:Ignore>前月以前の月別アーカイブ</mt:Ignore>
<mt:Entries>
<$mt:Var name="tmpl__entry_list">
</mt:Entries>
</mt:If>
今回はこれで要件を満たすことができましたが、必要ならばタグ名を案件固有の名前にしてもう少しカスタマイズすれば良さそうです。(案件固有のタグ名にしてカスタマイズする方法は、「【MT東京-23】春のプラグイン祭り」で教えて頂きました。)
まとめ
やはりプラグインを使うとスッキリしたテンプレートで要件を満たすことができました。MTにとてつもなく大きな変更がない限りプラグインが動かなくなることはないので、プラグインを積極的に使えば良いと私は考えます。
余談...変数名の命名規則
何ヶ月か前から変数名の命名規則を考えています。最近一時的に使うだけでいつでも上書きして良い変数にはtmp.
を付けていました。ただ、ダイナミックパブリッシングでドットを使った変数名が使えなかったような記憶があり、BEMっぽい雰囲気ですがtmp__
にしようかとなどと考えています。あとはページ全体で使う変数はpage__
、サイト全体で使う変数はsite__
とか...。