一覧表示を行う場合に sort_by へ指定できない順序や複数のソート条件で出力できますか
標準でも sort_by の指定やグループの並べ替えによって出力順を制御できますが、sort_by に対応していなかったり複数の条件で一覧出力したい場合、ハッシュを使うことで出力順を制御できます。
ハッシュのキーを工夫することで、複数のソート条件を持たせたり、昇順と降順を組み合わせるなど複雑やソートも実現できます。
下記は、公開日とカスタムフィールドの値、複数の条件で記事を一覧出力するサンプルです。
以降、次の前提で説明致します。
- 記事にカスタムフィールドが設定されている
- 名前 = 優先順位
- 種類 = テキスト
- タグ名 = MTCFEntryPriority
- カスタムフィールドには数字が入力される
- 出力順の規則
- 記事の公開日 (年月日) が新しい順に出力する
- 記事の公開日 (年月日) が同じ場合、カスタムフィールド「優先順位」の値が小さいものを優先する
上記の前提の場合、次のようなテンプレートで実現可能です。
テンプレート例
<MTEntries> <$MTTemplateNote value="ハッシュのキー (hash_entries_key) は MTEntryDate (記事の公開日) と MTCFEntryPriority (記事の優先順位)と MTEntryID (記事の ID)を繋げた値を使う"$> <MTSetVarblock name="hash_entries_key"><$MTEntryDate format="%Y/%m/%d"$>-<$MTCFEntryPriority zero_pad="4"$>-<$MTEntryID zero_pad="8"$></MTSetVarblock> <$MTTemplateNote value="ハッシュ (hash_entries) の中へ格納する"$> <MTSetVarblock name="hash_entries" key="$hash_entries_key"><a href="#"><MTEntryTitle escape="html"></a></MTSetVarblock> </MTEntries> <MTLoop name="hash_entries" sort_by="key"> <MTIf name="__first__"><ul></MTIf> <li><-- <$MTVar name="__key__"$> --><$MTVar name="__value__"$></li> <MTIf name="__last__"></ul></MTIf> </MTLoop>
出力例
<ul> <li><-- 2020/08/24-0005-00001695 --><a href="#">1番に表示されて欲しい記事</a></li> <li><-- 2020/08/25-0003-00005679 --><a href="#">2番に表示されて欲しい記事</a></li> <li><-- 2020/08/25-0100-00000093 --><a href="#">3番に表示されて欲しい記事</a></li> </ul>
実装する場合の注意点
- ハッシュのキーの桁数は揃える
ハッシュのキーは桁数を揃えた方がデバッグを行いやすくなり、テンプレート例では MTCFEntryPriority と MTEntryID タグに zero_pad を指定して桁を揃えています。
- ハッシュのキーは重複しないように一意の値とする
テンプレート例では MTEntryID (記事の ID) をキーに含めることでキーを一意の値にしています。
- ブロックタグのループ処理回数を最低限にする
上記の例では MTEntries タグにモディファイアを指定していませんが、特に「○○でソートして、上位△件まで出力する」といった場合においては実際に出力される△件以上は不要であるものの、ソートのためのデータを集めるためには△件以外に対してもループ処理する必要があります。こういった状況では記事件数の増加とともに次第に再構築時間が長くなってしまうため、モディファイア等を使って対象を限定し、ブロックタグのループ処理回数を最低限に抑えるようにしてください。