Craft CMS ですべてのエントリーを取得したり動的なキーの連想配列を作ったり数を出力したりする Tips

Craft CMS ですべてのエントリーを取得したり、動的なキーの連想配列を作ったり、動的なキーで出力したりする Tips をご紹介します。

Craft CMS Logo

この記事は「Craft CMS Advent Calendar 2017」の 14 日目の記事です。今日は Craft CMS の基本的なお話になります。

Craft CMS でエントリーの情報を取得するとき、例えばセクションのハンドル名が blog だったとすると、下記のように取得できます。

{% set blogs = craft.entries.section('blog') %}

すべてのエントリーを取得する

例えば、Craft の blog セクションに 3,000 記事が登録されていたとすると、上記の書き方だと limit の初期値である 100 件までしか取得できません。

もし、すべてのエントリーを取得したい場合は下記のようにして limitnull を渡せば OK です。

{% set blogs = craft.entries.section('blog').limit(null) %}

これを知らないと、ついつい .limit(99999) とかやりそうですよね。

すべてのセクションのすべてのエントリーを取得する

ついでに、すべてのセクションのすべてのエントリーを取得したい時は下記のよう書きます。

<ul>
 {% for entry in craft.entries.limit(null) %}
 <li>{{ entry.title }}</li>
 {% endfor %}
</ul>

すべてのセクションのすべてのエントリーをセクションごとに取得する

この場合は下記のように書きます。

{% for section in craft.sections.getAllSections() %}
<h2>{{ section.name }}</h2>
<ul>
 {% for entry in craft.entries.section(section.handle).limit(null) %}
 <li>{{ entry.title }}</li>
 {% endfor %}
</ul>
{% endfor %}

セクションに属するエントリーの数を取得する

この場合は下記のように書きます。 count() を使えば簡単です。

<ul>
 {% for section in craft.sections.getAllSections() %}
 <li>{{ section.name }} = {{ craft.entries.section(section.handle).limit(null).count() }} エントリーあります。</li>
 {% endfor %}
</ul>

ちなみに一度配列にセットしてあれば、 {{ 配列変数名 | length }} でとれますね。

動的なキーの連想配列をセットし、動的なキーで連想配列から値を取り出す

例えば entries という連想配列があって、そのキーにセクションのハンドル名、値にそのセクションのすべてのエントリー、のような変数を作りたいときは下記のようにします。ついでにその連想配列の値を動的に取り出してみます(このテンプレートだけ見ると無駄が多いですが Tips として)。

{# キーを動的に連想配列をセットする #}
{% set entries = {} %}
{% set sections = {} %}
{% for section in craft.sections.getAllSections() %}
 {% set entries = entries|merge({ (section.handle) : craft.entries.section(section.handle).limit(null)} ) %}
 {% set sections = sections|merge({ (section.handle) : section.name }) %}
{% endfor %}
{# 動的にセットした連想配列を取り出す #}
{% for sectionHandle, sectionEntries in entries %}
 {# 動的なキーで連想配列から取り出す #}
 <h2>{{ attribute(sections, sectionHandle) }}({{ sectionHandle }})</h2>
 <ul>
 {% for entry in sectionEntries %}
 <li>{{ entry.title }}</li>
 {% endfor %}
 </ul>
{% endfor %}

ポイントは、

  • | merge() で動的にセットする
  • その際に動的なキーを () で囲む
  • attribute() で取り出す

といったところです。

以上です。

Published 2017-12-14
Updated 2019-06-25