Craft CMS のエントリを指定した ID 順で取得する

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

Craft CMS では、エレメントクエリの id パラメータに複数の ID をセットすることで、目的のエレメントだけを取得できます。

このとき、デフォルトの出力結果は エレメントの投稿日順 となるため、ID の指定順で取得する方法をご紹介します。

はじめに

Craft CMS でエントリを取得するには、次のようなコードを定義します。

{% set newsEntries = craft.entries.section('news').all() %}

ここではセクションハンドル news に投稿されたエントリを取得し、変数 newsEntries にセットしています。

.all() の時点でクエリを実行するため、絞り込みなどの条件はそれより前に追加していきます。例えば 最新5件だけ取得 するため limit パラメータを付加する場合、次のようになります。

{% set newsEntries = craft.entries.section('news').limit(5).all() %}

指定 ID のエントリを取得する

では、任意の ID を指定して、それに該当するエントリだけを取得してみましょう。

{% set specifiedEntries = craft.entries.id([7,1,5,3]).all() %}

ID を複数指定するには id([7,1,5,3]) のように配列でセットします。ただし、このままだと ID の指定順 はなく 投稿日順 になるため、次のように fixedOrder を追加します。

{% set specifiedEntries = craft.entries.id([7,1,5,3]).fixedOrder().all() %}

これで期待通り ID の指定順 になります。

id と ids の違い

それぞれ、次のような違いがありますので打ち間違いに注意してください。

  • id は取得するエレメントの指定(limit などと同様、絞り込み条件を追加)
  • ids はクエリを実行して ID だけを取得(all などと同様、クエリを実行)

まとめ

利用頻度は高くないかもしれませんが、ID の指定順 通りにエントリを取得する方法について解説してみました。

「いくつかのセクションをあらかじめ別々に検索し、それぞれで取得した ID をマージしつつ元の検索結果のスコア順で出力する」といった用途にも使えますので、頭の片隅にでも入れておいてください。