MTで未来の記事はインデックスに、過去の記事はアーカイブリストに出力したい

公開

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__とか...。