PowerCMS™
2025年1月1日購入分よりライセンスの価格を改定いたします。
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[よくあるご質問] システムログに「タスクを実行するために必要なロックを獲得できませんでした」というログが残っている を追加しました。
[よくあるご質問] 特定のシステムログに絞って確認できますか? を追加しました。

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