我在 Craft CMS 中有多个名为“活动”和“最新新闻”的 2 个部分。我在这些部分中发布带有日期的条目。我的问题是我在前端有光滑的轮播,我想在其中显示这两个部分的条目,但按日期排序。类似事件应按事件日期排序,最新新闻应按新闻日期排序。我们如何使用 Craft CMS twig 模板在单个查询中实现此目的。
{% set entries = craft.entries.section(['events', 'latestNews']) %}
上面的查询为我提供了事件和最新新闻部分的所有条目。但是,我不知道如何在单个查询中使用分段字段对它们进行排序。
默认情况下,所有条目都有一个发布日期,即使您要跨多个部分进行查询,您也可以按该发布日期对查询进行排序:
{% set entries = craft.entries()
.section(['events', 'latestNews'])
.orderBy('postDate DESC')
.all()
%}
这将返回两个部分中的所有条目,并按发布日期降序排列。
如果您使用两个不同的字段来表示新闻日期和事件日期,那就有点复杂了。您可以使用数据库表达式,但这非常复杂并且不利于性能。
在这种情况下,我将使用设置为日期值的 Preparse 字段。在模板中,根据条目所在的部分输出新闻日期或事件日期。然后按“准备”字段排序。检查插件文档中的示例,了解如何在 Preparse 字段中输出日期值。
如果不是数据量大的情况,也许你可以在twig端进行排序...... 而不是使用:
{% for element in elements %}
...
{% endfor %}
使用类似:
{% for element in elements | sort((a,b) => a.orderField <=> b.orderField) %}
...
{% endfor %}
这样,没有用于排序的字段的部分将保持未排序状态,并按顺序冒泡。当然,您可以使用多个 for 循环来迭代不同排序的元素,同时保护某些元素(通过使用 if 块)。