0
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

Craft CMS で前後のエントリを取得する(チャンネルの場合)

前回に引き続き、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#エレメントクエリの複製

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?