WordPress Timber中如何获取ACF字段组的子字段对象?
在Timber中同时获取ACF子字段的标签与值
嘿,我之前在项目里也遇到过一模一样的需求!Timber本身虽然没有专门封装一个和ACF原生get_sub_field_object完全对应的方法,但完全可以通过ACF的原生函数结合Timber的用法来实现,不用分开循环标签和值,一次遍历就能搞定。
下面给你两种常用的实现方式,你可以根据自己的开发习惯选择:
方式一:在Twig模板中直接调用ACF函数
Timber允许在Twig里直接调用PHP函数(通过function()方法),所以我们可以直接使用ACF的get_field_object来获取子字段的标签信息,同时配合已经拿到的字段值来渲染内容:
{# 假设你已经在PHP中把apartment_specs字段值传到了Twig上下文 #} {% if apartment_specs %} {% for spec_item in apartment_specs %} <div class="spec-group"> {# 遍历当前重复项里的所有子字段键值对 #} {% for field_name, field_value in spec_item %} {# 调用ACF的get_field_object获取子字段的完整信息(包括标签) #} {% set field_obj = function('get_field_object', field_name, post.id) %} {% if field_obj and field_value %} <div class="spec-item"> <strong>{{ field_obj.label }}:</strong> {{ field_value }} </div> {% endif %} {% endfor %} </div> {% endfor %} {% endif %}
方式二:在PHP层提前整理好标签与值的组合
如果你更习惯在PHP里处理数据逻辑,再把整理好的数组传到Twig渲染,可以这样做:
// 在你的PHP模板文件(比如single.php或page.php)中 $context = Timber::context(); // 获取apartment_specs的字段值和字段对象(包含子字段定义) $apartment_specs = get_field('apartment_specs'); $specs_field_obj = get_field_object('apartment_specs'); $sub_fields = $specs_field_obj['sub_fields'] ?? []; $formatted_specs = []; if ($apartment_specs && $sub_fields) { foreach ($apartment_specs as $spec_group) { $group_data = []; foreach ($sub_fields as $sub_field) { $field_name = $sub_field['name']; $group_data[] = [ 'label' => $sub_field['label'], 'value' => $spec_group[$field_name] ]; } $formatted_specs[] = $group_data; } } // 把整理好的数据传到Twig上下文 $context['formatted_specs'] = $formatted_specs; Timber::render('your-template.twig', $context);
然后在Twig里就可以直接循环渲染整理好的数据:
{% if formatted_specs %} {% for group in formatted_specs %} {% for spec in group %} {% if spec.value %} <p>{{ spec.label }}: {{ spec.value }}</p> {% endif %} {% endfor %} {% endfor %} {% endif %}
补充说明
如果你是在ACF的have_rows循环结构中(而不是直接用get_field拿数组),也可以直接在Twig里调用function('get_sub_field_object', 'your_sub_field_name'),用法和ACF原生PHP代码几乎一致,Timber会自动处理上下文。
内容的提问来源于stack exchange,提问作者Gabriele Donini
相关产品推荐
相关产品推荐

