
本文详解如何在 WordPress 的 Advanced Custom Fields(ACF)中,正确获取并输出三层嵌套结构(Repeater → Group → Repeater)中的最内层字段值,避免 have_rows() 误用导致的数据无法读取问题。
本文详解如何在 wordpress 的 advanced custom fields(acf)中,正确获取并输出三层嵌套结构(repeater → group → repeater)中的最内层字段值,避免 `have_rows()` 误用导致的数据无法读取问题。
在 ACF 中构建复杂内容结构时,常见的嵌套模式如 Repeater → Group → Repeater(例如:合作伙伴列表 → 每个合作伙伴的信息组 → 该组内的多个事实条目)极易因 API 调用方式错误而失效。核心误区在于:对 Group 类型字段调用 have_rows() 是无效的——Group 本身不是可迭代的字段容器,它只是字段的逻辑分组;只有 Repeater 和 Flexible Content 字段才支持 have_rows() + the_row() 的循环模式。
正确的处理方式是:顶层 Repeater 使用 get_field() 返回数组,再通过 foreach 遍历;Group 字段直接作为关联数组访问;其内部的 Repeater 字段(如 facts)同样需先确认存在且为非空数组,再用 foreach 迭代。
以下是推荐的、稳定可靠的实现代码:
<?php $partners = get_field('partner'); // 注意:此处用 get_field(),而非 get_sub_field()
if ($partners) :
foreach ($partners as $partner) :
$info = $partner['info']; // Group 字段直接解构为数组
// 输出 Group 中的普通字段(字符串/文本等)
if (!empty($info['headline'])) :
echo '<h3>' . esc_html($info['headline']) . '';
endif;
if (!empty($info['subline'])) :
echo '<p class="subline">' . esc_html($info['subline']) . '</p>';
endif;
// 安全遍历嵌套的 facts Repeater
if (!empty($info['facts']) && is_array($info['facts'])) :
echo '
- ';
foreach ($info['facts'] as $fact_item) :
if (isset($fact_item['fact']) && !empty(trim($fact_item['fact']))) :
echo '
- ' . esc_html($fact_item['fact']) . ' '; endif; endforeach; echo '
暂无合作伙伴信息。
'; endif; ?>✅ 关键要点说明:
- ✅ 勿对 Group 调用 have_rows():info 是 Group 字段,have_rows('info') 永远返回 false,因此原代码中
这一段完全不会执行。 - ✅ 顶层 Repeater 必须用 get_field():在主模板(非 have_rows() 循环内)中,应使用 get_field('partner') 获取完整数组;若在 have_rows('partner') 循环内,则用 get_sub_field('info') 获取当前项的 Group 数据——但本例中更推荐统一使用 get_field() + foreach,逻辑更清晰、容错更强。
- ✅ 始终校验嵌套 Repeater 数据:$info['facts'] 可能为 null 或空数组,务必用 !empty() 和 is_array() 双重判断,防止 PHP 警告。
- ✅ 务必转义输出:使用 esc_html() 防止 XSS,尤其当字段内容来自用户输入时。
- ⚠️ 命名一致性检查:确保 ACF 字段名称(partner、info、facts、fact)与后台设置完全一致,区分大小写和下划线。
此方案兼容 ACF Pro 6.x 及主流 WordPress 版本,结构清晰、健壮性强,是处理多层嵌套字段的推荐实践。











