ACF Repeater判断任意行子字段为真的实现方案及代码问题排查
问题1解答
你最初的代码无法正常判断和ACF特性无关,属于PHP语法层面的问题:代码中$row变量未经过赋值就直接读取,你仅通过get_field('mytable')获取到了所有行组成的二维数组$rows,但没有将单条行数据赋值给$row变量,因此$row['displayoptions']的取值始终为null,判断条件自然不会触发。你后续新增的第一行取值逻辑刚好绕过了变量未定义的问题,但属于临时修补,没有解决根本问题。
问题2解答
根据你的使用场景,有两种规范实现方案,都可以满足需求:
方案1:数组处理方案(最简洁,适合仅判断表头输出场景)
如果已经通过get_field拿到了所有行数据,直接用数组方法提取字段判断即可,无需额外循环:
<?php $rows = get_field('mytable'); if ($rows) { // 提取所有行的displayoptions字段值 $all_display_status = array_column($rows, 'displayoptions'); // 只要存在一个为true的值就输出表头 if (in_array(true, $all_display_status, true)) { echo '<tr><td>OPTIONS</td></tr>'; } // 后续表格行输出逻辑可在此处继续编写 } ?>
方案2:ACF原生have_rows方案(符合ACF最佳实践,适合后续需要逐行输出内容的场景)
如果后续还要输出每行的表格内容,用ACF官方提供的循环语法更统一,避免数组索引操作出错:
<?php $has_enabled_option = false; // 先遍历判断是否存在启用的选项,找到就跳出循环节省性能 if (have_rows('mytable')) { while (have_rows('mytable')) { the_row(); if (get_sub_field('displayoptions')) { $has_enabled_option = true; break; } } } // 输出表头 if ($has_enabled_option) { echo '<tr><td>OPTIONS</td></tr>'; } // 重置ACF循环指针,后续可以正常遍历输出所有行内容 reset_rows(); if (have_rows('mytable')) { while (have_rows('mytable')) { the_row(); // 此处编写每行表格内容的输出逻辑 } } ?>
内容的提问来源于stack exchange,提问作者Kev
相关产品推荐
相关产品推荐

