Movable Typeでカスタムフィールド値による並び替え

フィルタリングとハッシュ・配列を利用したソート

こんにちは、Yuuです。

Movable Typeの<mt:Entries>で記事一覧を出力するとき、カスタムフィールドに入力させた値でフィルタリングしたり、ソートしたいって場合があるので、改めて書いてみました。
基本的には、カスタムフィールドのベースネームをのモディファイアとして指定することで、カスタムフィールドの値によって、出力する記事をフィルタリングすることができます。

カスタムフィールドの値に一致したものを出力

<mt:Entries>に下記モディファイアを指定することで出力できます。

field:customfieldbasename="foo"

例)条件に一致したエントリータイトルの出力例

<mt:Entries field:customfieldbasename="foo">
  <$mt:EntryTitle$>
</mt:Entries>

customfieldbasenameにカスタムフィールドのベースネームを指定
fooは一致させたいカスタムフィールドの値

※複数指定はできません。

カスタムフィールドの値でソート(並び替え)して出力

<mt:Entries>に下記モディファイアを指定することで出力できます。

sort_by="field:customfieldbasename"

例)条件に一致したエントリータイトルの出力例

<mt:Entries sort_by="field:customfieldbasename">
  <$mt:EntryTitle$>
</mt:Entries>

customfieldbasenameにカスタムフィールドのベースネームを指定

これで、カスタムフィールドの値をもとに、出力を並び変えることができます。
デフォルトは降順ですが、昇順に変えたい場合は「sort_order="ascend"」を指定します。

<mt:Entries sort_by="field:customfieldbasename" sort_order="ascend">
  <$mt:EntryTitle$>
</mt:Entries>

ここまでは公式ドキュメントにも記載されているのですが、
カスタムフィールドの値は文字列として扱われるため、値が数値の場合は数値順による並びにはなりません。

カスタムフィールドの値を数値でソート(並び替え)して出力

出力したい内容を一度ハッシュへ入れ、sort_by指定で「value numeric」を指定することで数値順にすることができます。

<mt:Entries>
  <$mt:EntryTitle setvar="title"$>
  <mt:SetVarBlock name="entries{$title}"><$mt:customfield$></mt:SetVarBlock>
</mt:Entries>
<mt:Loop name="entries" sort_by="value numeric">
  <$mt:Var name="__key__"$>
  <$mt:Var name="__value__"$>
</mt:Loop>

<$mt:Var name="__key__"$>で出力されるのは、<$mt:EntryTitle$>
<$mt:Var name="__value__"$>で出力されるのは、カスタムフィールドの値
numericを指定することで数値比較を行ってソートすることが可能です。

カスタムフィールドの複数値を数値でソート(並び替え)して出力

さらに応用。カスタムフィールドにカンマ区切りなどで複数の値を入れてあるとき、最初の数値でソートしたい場合があります。

しかし、<mt:Entries field:customfieldbasename="foo">では複数の値を指定することができません。また、テキストフィールド内はあくまで1文字列として認識されてしまうのでこれを配列に分ける必要もあります。

ということで、一度テキストフィールドの値を配列に変換した後、ハッシュへ入れ込み、ループで出力します。

値を配列化する

配列に変換するために、Splitプラグインをインストールします。
インストール後、「split=""」というモディファイアが使えるようになります。
テキストフィールドの値がカンマ区切りであれば、下記のようになります。

<$mt:customfield split="," setvar="hoge"$>

カスタムフィールドの値をカンマ区切りを基準に配列へ、そして、変数hogeにセットします。
この配列の最初の値を表示する場合は下記のようにします。

<$mt:Var name="hoge[0]"$>

これで、1つ目の値が出力できます。

ハッシュ入れ込みとループ出力

<mt:Entries>
  <$mt:EntryTitle setvar="title"$>
  <mt:SetVarBlock name="entries{$title}"><$mt:Var name="hoge[0]"$></mt:SetVarBlock>
</mt:Entries>
<mt:Loop name="entries" sort_by="value numeric">
  <$mt:Var name="__key__"$>
  <$mt:Var name="__value__"$>
</mt:Loop>

ポイントは、下記で配列の値をセットしているところ。

<mt:SetVarBlock name="entries{$title}"><$mt:Var name="hoge[0]"$></mt:SetVarBlock>

これで、複数値があっても、指定した値でソートすることが出来ます。

個人的には、MTAppjQueryのMTAppMultiCheckboxを利用しているときによく出番があります。
配列やハッシュ、ループを使うとうまく出力できるので、上手に使っていければな、と。

参考

トラックバック

TRACKBACK&PING

TrackBack URL :

コメントを残す

メールアドレスが公開されることはありません。