我正在尝试使用 Twig 1.34 的 WordPress Timber 插件实现对 WordPress 插件高级自定义字段 (ACF) 的转发器字段的输出进行排序。下面从 ACF 排序的基本 PHP 示例来自https://www.advancedcustomfields.com/resources/how-to-sorting-a-repeater-field/ https://www.advancedcustomfields.com/resources/how-to-sorting-a-repeater-field/ACF 论坛中没有针对我的问题的可用答案。
所以我尝试将此函数从示例转换为 Timber/Twig:
// get repeater field data
$repeater = get_field('repeater');
// vars
$order = array();
// populate order
foreach( $repeater as $i => $row ) {
$order[ $i ] = $row['id'];
}
// multisort
array_multisort( $order, SORT_DESC, $repeater );
// loop through repeater
if( $repeater ): ?>
<ul>
<?php foreach( $repeater as $i => $row ): ?>
<li><?php echo $row['id']; ?>. <?php echo $row['name']; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
我已经实施了view.twig
有效的文件如下。我的 ACF 中继器字段称为时间线,有两个子字段:日期和描述。
{% set repeater = timeline %}
{% for i, row in repeater %}
{{ row.date}}
{{ row.description}}
{% endfor %}
输出 ACF 中继器的现有字段(数组)timeline
- 日期和描述这两个字段 - 按照日期顺序从最旧的开始,这是默认的,如下所示:
Jan 2010
洛雷姆·伊普苏姆哈哈哈哈哈哈
Jul 2011
Lorem Ipsum 等等 Lorem Ipsum
但我想先按最新日期排序。
根据这个答案Twig_Error_Syntax 表示“未知过滤器”,在 Timber 中带有 Twig 过滤器 https://stackoverflow.com/questions/49836358/twig-error-syntax-for-unknown-filter-with-a-twig-filter-in-timber我需要创建一个使用的过滤函数Twig_SimpleFilter
并对中继器字段数组进行排序。
我已经测试过了,样本rot13
从该答案中过滤出来的作品{{ 'test text'|rot13 }}
.
但是当尝试使用相同的Twig_SimpleFilter
结构体,其中包含按日期对数组进行排序的代码,即在我的主题中使用它functions.php
file:
add_filter('timber/twig', function($twig) {
$twig->addExtension(new Twig_Extension_StringLoader());
$twig->addFilter(
new Twig_SimpleFilter(
'sort_timeline',
function($string) {
$repeater = get_field('timeline');
$order = array();
foreach( $repeater as $i => $row ) {
$order[ $i ] = $row['date'];
}
array_multisort( $order, SORT_DESC, $repeater );
}
)
);
return $twig;
});
并像这样调用过滤器{% for i, row in repeater|sort_timeline %}
在 for 循环中view.twig
{% set repeater = timeline %}
{% for i, row in repeater|sort_timeline %}
{{ row.date}}
{{ row.description}}
{% endfor %}
我得到的只是一个白屏,并且 php 日志中没有错误。
FWIW,使用rot13
过滤器喜欢{% for i, row in repeater|rot13 %}
也显示白屏,所以整体有问题Twig_SimpleFilter
.
(顺便说一句,我还意识到我可能需要将 php 日期格式转换为$row['date']
要正确排序,也许使用strtotime
,因为现在只是月份和年份。)
在 Twig 中使用过滤器是尝试这个的正确方法吗?或者是否可以适应和使用array_multisort( $order, SORT_DESC, $repeater );
直接在函数中.twig
模板?
编辑 2018 年 4 月 17 日
@num8er 的代码适用于 php5+。 php7 运算符似乎是一个问题。
并且,下面的另一个函数将对中继器的后端行进行排序;更改值并添加到主题的functions.php
文件。看https://support.advancedcustomfields.com/forums/topic/sort-repeater-in-back-end-where-data-is-entered/ https://support.advancedcustomfields.com/forums/topic/sort-repeater-in-back-end-where-data-is-entered/
获取 MySQLfield_123456789
您要排序的行名称,进入ACF导出页面并导出字段组。https://support.advancedcustomfields.com/forums/topic/how-to-retrieve-a-group-field-key/ https://support.advancedcustomfields.com/forums/topic/how-to-retrieve-a-group-field-key/
add_filter('acf/load_value/name=timeline', 'my_acf_load_value', 10, 3); //repeater name is timeline
function my_acf_load_value( $rows)
{
foreach( $rows as $key => $row ) {
$column_id[ $key ] = $row['field_5967e7639a09b'];
}
array_multisort( $column_id, SORT_DESC, $rows );
return $rows;
}