FilteredObjects - MTの「フィルタ」機能を公開側で利用するプラグイン

  • 投稿日:
  • by
  • カテゴリ:

Movable Type のリスティングフレームワークの機能の一部である「フィルタ」を、MTタグやDataAPIのエンドポイントで利用することができるFilteredObjectsというプラグインを公開しました。

mt-plugin-FilteredObjects

記事やウェブページを複雑な条件で絞り込んで表示する場合、これまでは MTML で頑張るか、SearchEntriesで条件を指定していたと思います。FilteredObjects プラグインはこういったケースでのもう一つの選択肢になるものです。MTの「フィルタ」機能を利用するため(「フィルタ」は管理画面からGUIで条件を編集できるので)、プログラミングの知識がなくても条件を細かく指定することができ、MTMLの方ではそれを使ってシンプルな書式で結果を得ることができるようになります。

Getting sterted(とりあえず使ってみる)

プラグインのインストール

まずはFilteredObjectsプラグインをインストールしてください。

リスティングフレームワークを拡張するプラグインのインストール(必要な場合だけ)

FilteredObjectsはリスティングフレームワークを拡張する別のプラグインと組み合わせるとより強力になります。(プラグインによっては組み合わせることができない可能性もあります。)そして特に、カスタムフィールドで複数の条件を指定して絞り込みができるとここでは格段に便利になると思うので、おすすめはCustomFieldsListingプラグインです。(ただ実は、CustomFieldsListingプラグインはFilteredObjects側からだいぶ無理して利用させてもらう形になっているので、同時に利用した場合CustomFieldsListingの機能が正常に動作しなくなってしまう可能性があります。同時利用で不具合が起きる場合にはFilteredObjectsプラグインを削除してください)

「フィルタ」の準備

一覧ページで「フィルタ」の新規作成へと進み、条件を指定したあと、「識別子」を指定して「フィルタ」を保存してください。

screen-shot 2016-12-20 4.15.34.png

screen-shot 2016-12-20 4.17.36.png

MTMLで出力する

「識別子」を付けて保存した「フィルタ」は mt:FilteredEntries と mt:FilteredPages を使って以下のように出力することができます。

Data API で取得する

Data API では /filtered-objects/entries に filter パラメータを指定して取得することができます。

Advanced Usage(もう少し凝った使い方)

MTの「フィルタ」では、「または(OR)」という条件を指定することができないのですが、FilteredObjects では複数の「フィルタ」を「または(OR)」でつなげることができます。

やや複雑になるので、具体的な例で考えてみます。

複数のニュースのブログから条件を指定してピックアップする

以下のように、複数のニュース用のブログがあるとします。

  • 会社全体のニュース
  • 製品毎のニュース

ここで、ウェブサイトのトップページに、

  • 会社全体のニュースからは全部
  • 製品毎のニュースからは「全体のニュースに表示する」にチェックを入れたものだけ

という条件で表示するケースを考えます。

この場合は「フィルタ」を2つ、それぞれ上の条件と同じものを指定して作成します。(特定のブログを指定するための「ブログID」の条件はMTの標準では表示されませんが、FilteredObjects をインストールすると表示されるようになります。)

screen-shot 2016-12-20 5.00.56.pngscreen-shot 2016-12-20 5.03.40.png

screen-shot 2016-12-20 5.09.59.pngscreen-shot 2016-12-20 5.10.34.png

スクリーンショットの内容で、以下の2つのフィルタを作成したとします。

  • blog-general-news
  • show-in-general-news

ここまでできれば MTML 側は簡単で、 mt:FilteredEntries タグの filter に2つのフィルタを「OR」でつなげて指定することで目的の記事を表示することができます。

また、Data API の /filtered-objects/entries エンドポイントで取得することもできます。

制限事項など

  • MTタグ、Data APIのエンドポイントの両方で、公開されている記事のみが対象になります
  • 誤って削除してしまうことのないように、「識別子」を付けた「フィルタ」ではゴミ箱アイコンが表示されなくなります
    • 「システム > フィルタの管理」で削除することができます
  • 種類が「日付と時刻」のフィールドでは「今より前」「今より後」が表示されますが、これは CustomFieldsListing を独自に拡張しているもので、うまく動かない場合は FilteredObjects 側の問題です
    • 日付の場合「今より前」は「今日の23時59分59秒より前」となり、「今より後」は「今日の0時0分0秒より後」となります
  • 「自分の記事」の条件には未対応です
  • 対象となるブログは「フィルタ」からいい感じに選択されるはずですが、うまくいかない場合には明示的に指定してください
    • mt:FilteredEntries/mt:FilteredPages では、マルチブログのモディファイアを指定することができます
    • /filtered-objects/entries エンドポイントでは、blogIds パラメータにブログのIDを「,」(カンマ)区切りで複数指定することができます

FilteredObjects プラグインでの「フィルタ」の運用について

MTでは「フィルタ」は「ユーザ」毎に管理されるデータなので、FilteredObjectsのようにテンプレートやData APIでで利用する道具としては向いていない部分があります。(他の「ユーザ」の「フィルタ」を見ることができない、など。)

「識別子」のついた「フィルタ」がいろいろな「ユーザ」のデータとして散らばるのは好ましくないと思うので、現時点としては『専用の「ユーザ」を作成して、全ての「フィルタ」はそこで管理する』が現実的な一つの回避策ではないかと思っています。

プラグインのインストール

  1. GitHubからzipファイルをダウンロードしてください。リリース一覧
  2. ダウンロードしたファイルを展開してください。
  3. pluginsディレクトリにアップロードしてください。

    インストール後のディレクトリの配置は以下のようになります。

    $MT_HOME/
        plugins/
            FilteredObjects/

サポートしている機能

  • スタティックパブリッシング
  • Data API

サポートしていない機能

  • ダイナミックパブリッシング

動作環境

  • MT6

この記事について

この記事は Movable Type Advent Calendar 2016 の20日目の記事です。