PowerCMS™
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[新着情報] PowerCMSクラウド 月額費用の価格改定に関する追加情報を公開します を追加しました。
[よくあるご質問] サポートサイトへ登録しているアカウントの情報を変更することはできますか? を追加しました。
[新着情報] PHP 8.2 に対応した PowerCMS 6.5 の提供を開始 を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > プラグイン > MTEntries で field.foo が「空でない」ものにフィルタするプラグイン

2015年01月23日

MTEntries で field.foo が「空でない」ものにフィルタするプラグイン

ブロックタグ MTEntries には、モディファイア field.foo="bar" を指定すると、カスタムフィールド foo の値が bar のもののみに絞り込む機能があります。ですが、この機能では「空でない」ものに絞り込むことができません。


例えば、

  • 記事を日本語で作成しているが、たまに英語版を作成することがある。
  • 英語版は顧客の希望により、日本語版と同じ編集画面で作成するので、タイトルや本文を入力する欄はカスタムフィールドで作成した。
  • 英語版があるかどうかは、カスタムフィールド「英語版タイトル」に入力があるもの、というルールになっている。

といった状況で、

  • インデックステンプレートに、カテゴリ「サンプルカテゴリ」内の「英語版タイトル」を新しいものから3件表示したい

というテンプレートを書こうとすると、ちょっとハードルが上がります。field.foo が「空でない」という条件で絞り込めないので、

  • カテゴリ内の記事を全件ループして、英語版タイトルがあるかどうかをチェックしつつ3件まで取得してループが終わったあとに出力するか...

といったことを考えます。全件ループすればきっとできますね。

でも、インデックステンプレートは記事を公開するときに再構築されます。記事数が少なければ問題にならないかもしれませんが、2万件ある、という状況だと、記事の保存にやたら時間がかかる、という問題が浮上してきそうです。記事はあとから増えるものですし。


ブロックタグは途中でループを抜けることができないので、処理を圧縮するためにはループの回数を減らさなければなりません。また、端的に条件を満たすものだけループ対象に含めることができるなら最適ですね。

先日、案件で必要になり、これを実現するプラグインを作成しました。

このプラグインをインストールすると、MTEntriesfield.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です
※ スタティックパブリッシング限定です。ダイナミックパブリッシングでは仕組み上、「空でない」という条件を渡すことができないため

後日、このプラグインが内部で行っている処理について紹介します。


カテゴリー
プラグイン
技術情報

Recent Entries