Movable Typeの記事一覧をカスタムフィールドの値で並べ替える

Movable Typeの記事一覧を表示する際、カスタムフィールドの値で並べ替える実装を試してみます。

記事の場合

例として、イベントの登録のように記事公開日とは別の日付情報(イベント開催日)があり、その日付順に並べたいという想定で実装してみます。
まずはカスタムフィールドで以下のようなフィールドを用意します。

  • 名前:イベント開催日
  • 種類:日付と時刻
  • オプション:日付
  • ベースネーム:eventdate
  • テンプレートタグ:EntryEventDate

テスト用に以下のような記事情報を登録します。

  • イベントA
    • 公開日:2024-12-01
    • イベント開催日:2024-12-25
  • イベントB
    • 公開日:2024-12-02
    • イベント開催日:2024-12-24
  • イベントC
    • 公開日:2024-12-03
    • イベント開催日:2024-12-24
  • イベントD
    • 公開日:2024-12-04
    • イベント開催日:未設定

これで準備ができたので、まずは特に設定しないで記事一覧を表示してみます。

<mt:Entries>
  記事名:<mt:EntryTitle>
  公開日:<mt:EntryDate format="%Y.%m.%d">
  <mt:If tag="EntryEventDate">
    イベント開催日: <mt:EntryEventDate format="%Y.%m.%d">
  </mt:If>
</mt:Entries>

この場合、公開日の新しい順で表示されます。

記事名:イベントD
公開日:2024.12.04

記事名:イベントC
公開日:2024.12.03
イベント開催日: 2024.12.24

記事名:イベントB
公開日:2024.12.02
イベント開催日: 2024.12.24

記事名:イベントA
公開日:2024.12.01
イベント開催日: 2024.12.25

次にイベント開催日順を試してみます。
sort_byの設定でカスタムフィールドのベースネーム(eventdate)を使って設定します。

<mt:Entries sort_by="field:eventdate">
  記事名:<mt:EntryTitle>
  公開日:<mt:EntryDate format="%Y.%m.%d">
  <mt:If tag="EntryEventDate">
    イベント開催日: <mt:EntryEventDate format="%Y.%m.%d">
  </mt:If>
</mt:Entries>

これでイベント開催日の新しい順に並べることができました。
イベント開催日が同じ記事同士の場合は公開日の新しい順に、イベント開催日が未登録の場合は登録した記事より後に並ぶようです。

記事名:イベントA
公開日:2024.12.01
イベント開催日: 2024.12.25

記事名:イベントC
公開日:2024.12.03
イベント開催日: 2024.12.24

記事名:イベントB
公開日:2024.12.02
イベント開催日: 2024.12.24

記事名:イベントD
公開日:2024.12.04

コンテンツタイプの場合

次にコンテンツタイプの場合を試してみます。
以下のようなフィールドを用意します。

  • フィールド:日付
  • 名前:イベント開催日

記事の時と同様に、以下のようなコンテンツデータを登録します。

  • イベントA
    • 公開日:2024-12-01
    • イベント開催日:2024-12-25
  • イベントB
    • 公開日:2024-12-02
    • イベント開催日:2024-12-24
  • イベントC
    • 公開日:2024-12-03
    • イベント開催日:2024-12-24
  • イベントD
    • 公開日:2024-12-04
    • イベント開催日:未設定

まずは特に設定しないで一覧を表示してみます。
content_typeのXXXXXにはコンテンツタイプ名を入れてください。

<mt:Contents content_type="XXXXX">
  記事名:<mt:ContentLabel>
  公開日:<mt:ContentDate format="%Y.%m.%d">
  <mt:ContentField content_field="イベント開催日">
    イベント開催日: <mt:ContentFieldValue format="%Y.%m.%d">
  </mt:ContentField>
</mt:Contents>

これで公開日の新しい順に表示することができました。

記事名:イベントD
公開日:2024.12.04

記事名:イベントC
公開日:2024.12.03
イベント開催日: 2024.12.24

記事名:イベントB
公開日:2024.12.02
イベント開催日: 2024.12.24

記事名:イベントA
公開日:2024.12.01
イベント開催日: 2024.12.25

次にイベント開催日順を試してみます。
sort_byの設定で日本語のカスタムフィールドを使えないので、ユニークIDを使って設定します。

<mt:Contents content_type="XXXXX" sort_by="field:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">
  記事名:<mt:ContentLabel>
  公開日:<mt:ContentDate format="%Y.%m.%d">
  <mt:ContentField content_field="イベント開催日">
    イベント開催日: <mt:ContentFieldValue format="%Y.%m.%d">
  </mt:ContentField>
</mt:Contents>

これでイベント開催日の新しい順に並べることができたのですが、記事の時と並びが少し異なるようでした。
イベント開催日が未登録の場合は登録した記事より後に並ぶという点は同じなのですが、イベント開催日が同じ記事同士の場合に公開日の古い記事の方が上に表示されていました。

記事名:イベントA
公開日:2024.12.01
イベント開催日: 2024.12.25

記事名:イベントB
公開日:2024.12.02
イベント開催日: 2024.12.24

記事名:イベントC
公開日:2024.12.03
イベント開催日: 2024.12.24

記事名:イベントD
公開日:2024.12.04

試しにイベントBの公開日を2024.12.05に変更してみたのですが、並び順に変わりはありませんでした。
そのため、公開日の古い順や記事の変更日順というわけでもなさそうで、おそらく記事作成日順に並んでいそう?な気がします。
ただ細かく検証しているわけではないのと、バージョンによる挙動の差という可能性もあるので、コンテンツタイプでの実装の際は注意が必要そうです。

参考サイト

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2025年1月
 1234
567891011
12131415161718
19202122232425
262728293031