如何排查ACF group字段内repeater字段的调用代码错误
问题根因
代码核心错误是把ACF Group字段按照Repeater的逻辑做了循环遍历,直接导致内部嵌套字段的上下文定位失效。
ACF Group属于单组集合型字段,本身只存储一组结构化数据,不存在多组重复内容,不需要使用have_rows() + the_row()的循环结构处理外层。多套这层无意义的循环后,ACF无法正确匹配内层Repeater的字段路径,自然读不到数据。
修正方案
两种写法都可以正常取到数据,按需选择即可:
写法1:沿用ACF循环函数
直接通过「Group字段名_子Repeater字段名」的格式定位内层Repeater,不需要额外处理外层Group:
<?php if( have_rows( 'acf_group_acf_repeater' ) ): ?> <ul> <?php while( have_rows( 'acf_group_acf_repeater' ) ): the_row(); $link_text = get_sub_field( 'acf_repeater_field_text' ); $link_url = get_sub_field( 'acf_repeater_field_url' ); ?> <li> <a href="<?php echo esc_url($link_url); ?>"><?php echo esc_html($link_text); ?></a> </li> <?php endwhile; ?> </ul> <?php endif; ?>
写法2:先获取Group整体数据再遍历
先拿到Group字段的全部结构化数据,再直接遍历内部的Repeater数组,逻辑更直观:
<?php $group_content = get_field('acf_group'); if( !empty($group_content['acf_repeater']) ): ?> <ul> <?php foreach( $group_content['acf_repeater'] as $link_item ): ?> <li> <a href="<?php echo esc_url($link_item['acf_repeater_field_url']); ?>"><?php echo esc_html($link_item['acf_repeater_field_text']); ?></a> </li> <?php endforeach; ?> </ul> <?php endif; ?>
注意事项
- 代码中新增的
esc_url()、esc_html()是WordPress官方要求的输出转义函数,可避免恶意代码注入,正式环境建议保留。 - 核心规则记牢:Group字段是单值集合,永远不要给外层Group套
have_rows()循环,这类循环只适用于Repeater、Flexible Content这类支持多组重复内容的字段。
内容的提问来源于stack exchange,提问作者Jirka
相关产品推荐
相关产品推荐

