Craft CMS のエントリ URL にカテゴリパスを追加する

これは Craft CMS Advent Calendar 2020 1日目の記事です。

Craft CMS では、セクションごとの エントリ URI 形式 にセットした内容に応じてエントリ詳細ページの URL が決定します。news/{id} のように入力データに依存しない形式であれば問題ありませんが、カテゴリパスを加えたい場合ひと工夫が必要です。

そこで今回は、複数階層のカテゴリパスを エントリ URL に加える方法について解説します。

事前準備

セクションの エントリ URI 形式 を調整するにあたり、事前に カテゴリグループカテゴリフィールド を用意し、セクションの入力タイプにセットしておきます。

カテゴリグループの作成

カテゴリグループの設定画面

ここでのポイントは カテゴリ URI 形式

{parent.uri ? parent.uri ~ '/' : ''}{slug}

と入力している点です。これにより、階層構造を持つ場合に親カテゴリのパスを引き継ぐようになります。

カテゴリ一覧

カテゴリフィールドの作成

フィールドの設定画面

ここでセットした ハンドルエントリ URI 形式 で利用しますので、覚えておいてください。

セクション設定の調整

セクションの設定画面

ここでのポイントは エントリ URI 形式

news/{newsCategory.inReverse().one().uri}/{slug}

と入力している点です。

newsCategory は事前に作成したカテゴリフィールドを指し、.inReverse().one().uri で逆順にした最初の(つまり、選択された末端の)カテゴリの URI がセットされます。

エントリ一覧

エントリ一覧に表示させた URI で、期待通りのパスになっていることを確認できました。

まとめ

今回はエントリに紐づいた カテゴリ を利用しましたが、URI を取得できるものであれば、関連づけられた他のエレメントでも同様の設定が可能です。

また URI 形式 の入力欄に Twig フィルタも使えますので、news/{postDate | date('Ymd-Hi')} のように投稿日時を整形して出力するなど、お好みで調整してみてください。