前回に引き続き、Craft CMS の詳細ページテンプレートで前後のエントリへのリンクを出力する方法について。
今回は チャンネル
の場合のサンプルコード。
チャンネル
セクションの場合、エントリの並び順を整数値で DB に保持している訳ではないため、投稿日を利用して絞り込みを行う。
直前のエントリへのリンクを出力
{% set prevEntry = craft.entries
.section('news')
.id('not ' ~ entry.id)
.postDate('<= ' ~ entry.postDate.timestamp)
.orderBy('postDate desc')
.one() %}
{% if prevEntry %}
<a href="{{ prevEntry.url }}">{{ prevEntry.title }}</a>
{% endif %}
直前のセントリの取得にあたり
-
.id('not ' ~ entry.id)
で現在のエントリを除外 -
.postDate('<= ' ~ entry.postDate.timestamp)
で投稿日のタイムスタンプ以前のものだけに絞り込み -
.orderBy('postDate desc')
で投稿日の降順にソート
を行なった上で、最後に .one()
で最初の1件だけを取得している。
直後のエントリへのリンクを出力
{% set nextEntry = craft.entries
.section('news')
.id('not ' ~ entry.id)
.postDate('>= ' ~ entry.postDate.timestamp)
.orderBy('postDate asc')
.one() %}
{% if nextEntry %}
<a href="{{ nextEntry.url }}">{{ nextEntry.title }}</a>
{% endif %}
こちらも「直前のエントリ」と考え方は同じだが
-
.postDate('>= ' ~ entry.postDate.timestamp)
で投稿日のタイムスタンプ以降のものだけに絞り込み -
.orderBy('postDate asc')
で投稿日の昇順にソート
の調整を行なっている。
参考:カテゴリを絞り込む場合
{% set category = entry.category_news.one() %}
{% set prevEntry = craft.entries
.section('news')
.relatedTo({
targetElement: category_news,
field: 'category_news'
})
.id('not ' ~ entry.id)
.postDate('<= ' ~ entry.postDate.timestamp)
.orderBy('postDate desc')
.one() %}
エントリに紐づいている最初のカテゴリと同じカテゴリに属するものだけに絞り込む場合の例。リレーションに関する絞り込みは .relatedTo
を利用する。
参考:エレメントクエリを共通化する場合
{# 共通のエレメントクエリをセット #}
{% set entryQuery = craft.entries
.section('news')
.id('not ' ~ entry.id)
.limit(1) %}
{# 「直前のエントリ」を取得 #}
{% set prevEntry = clone(entryQuery)
.postDate('<= ' ~ entry.postDate.timestamp)
.orderBy('postDate desc')
.one() %}
{# 「直後のエントリ」を取得 #}
{% set nextEntry = clone(entryQuery)
.postDate('>= ' ~ entry.postDate.timestamp)
.orderBy('postDate asc')
.one() %}
エレメントクエリを使い回すため、clone(query)
で複製したものを利用している。詳細は下記参照。
Craft 3 の変更点 > エレメントクエリの複製
https://docs.craftcms.com/v3/ja/changes-in-craft-3.html#エレメントクエリの複製