2015年01月23日
MTEntries で field.foo が「空でない」ものにフィルタするプラグイン
ブロックタグ MTEntries
には、モディファイア field.foo="bar"
を指定すると、カスタムフィールド foo の値が bar のもののみに絞り込む機能があります。ですが、この機能では「空でない」ものに絞り込むことができません。
例えば、
- 記事を日本語で作成しているが、たまに英語版を作成することがある。
- 英語版は顧客の希望により、日本語版と同じ編集画面で作成するので、タイトルや本文を入力する欄はカスタムフィールドで作成した。
- 英語版があるかどうかは、カスタムフィールド「英語版タイトル」に入力があるもの、というルールになっている。
といった状況で、
- インデックステンプレートに、カテゴリ「サンプルカテゴリ」内の「英語版タイトル」を新しいものから3件表示したい
というテンプレートを書こうとすると、ちょっとハードルが上がります。field.foo
が「空でない」という条件で絞り込めないので、
- カテゴリ内の記事を全件ループして、英語版タイトルがあるかどうかをチェックしつつ3件まで取得してループが終わったあとに出力するか...
といったことを考えます。全件ループすればきっとできますね。
でも、インデックステンプレートは記事を公開するときに再構築されます。記事数が少なければ問題にならないかもしれませんが、2万件ある、という状況だと、記事の保存にやたら時間がかかる、という問題が浮上してきそうです。記事はあとから増えるものですし。
ブロックタグは途中でループを抜けることができないので、処理を圧縮するためにはループの回数を減らさなければなりません。また、端的に条件を満たすものだけループ対象に含めることができるなら最適ですね。
先日、案件で必要になり、これを実現するプラグインを作成しました。
このプラグインをインストールすると、MTEntries
で field.foo="IS NOT EMPTY"
と指定することで、field.foo
が「空でない」ものに絞り込むことができます。
<pre>
<MTEntries field:entryenglishtitle="IS NOT EMPTY" category="サンプルカテゴリ" limit="3">
<$MTEntryDate format="%Y-%m-%d %H:%M:%S"$>
ID: <$MTEntryID$>: <MTEntryCategories glue=", "><$MTCategoryLabel$></MTEntryCategories>
日本語版タイトル: <$MTEntryTitle$>
英語版タイトル: <$MTCFEntryEnglishTitle$>
--------------------</MTEntries>
</pre>
※ 「英語版タイトル」のカスタムフィールドのベースネームは entryenglishtitle
、テンプレートタグはMTCFEntryEnglishTitle
です
※ スタティックパブリッシング限定です。ダイナミックパブリッシングでは仕組み上、「空でない」という条件を渡すことができないため
後日、このプラグインが内部で行っている処理について紹介します。
コメントを投稿する