You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需指定行名循环ACF嵌套组内的所有子行?

解决方案:循环遍历ACF嵌套组,简化重复代码

我懂你现在的困扰——这段重复处理meal_1到meal_5的代码太冗余了,改成循环不仅更简洁,后续要加更多餐次也方便维护。下面直接给你优化后的代码,再拆解关键逻辑:

优化后的完整代码

<?php if( have_rows('zero') ): ?>
<div class="grid-50" style="float: left;">
    <table>
        <tr>
            <th colspan="2">Zero</th>
        </tr>
        <?php while( have_rows('zero') ) : the_row(); ?>
            <tr>
                <td>Upon Waking</td>
                <td><?php the_sub_field('upon_waking')?></td>
            </tr>

            <?php
            // 定义餐次范围,后续要加餐次直接修改数字即可
            $meal_count = 5;
            for ($i = 1; $i <= $meal_count; $i++) {
                // 动态生成当前餐次的字段名:meal_1、meal_2...
                $meal_field = "meal_{$i}";
                
                // 合并两个判断条件:餐次组存在 + 餐次编号不超过每日餐数
                if ( have_rows($meal_field) && $i <= $feeds_per_day ) {
                    while( have_rows($meal_field) ) {
                        the_row();
                        
                        // 提取蛋白质、碳水、脂肪的选择项与对应标签
                        $protein_object = get_sub_field_object('protein_select');
                        $protein_value = get_sub_field('protein_select');
                        $protein_label = $protein_object['choices'][$protein_value];
                        
                        $carb_object = get_sub_field_object('carb_select');
                        $carb_value = get_sub_field('carb_select');
                        $carb_label = $carb_object['choices'][$carb_value];
                        
                        $fat_object = get_sub_field_object('fat_select');
                        $fat_value = get_sub_field('fat_select');
                        $fat_label = $fat_object['choices'][$fat_value];
                        
                        // 保留你原本的数值运算逻辑
                        $protein_amount = round($zero_protein_feed / $protein_value * 10) * 10;
                        $fat_amount = round($zero_fat_feed / $fat_value * 10) * 10;
            ?>
                        <tr>
                            <td>Meal <?php echo $i; ?></td>
                            <td><?php echo $protein_amount; ?>g <?php echo $protein_label; ?>, <?php echo $fat_amount; ?>g <?php echo $fat_label; ?></td>
                        </tr>
            <?php
                    }
                }
            }
            ?>
        <?php endwhile; ?>
    </table>
</div>
<?php endif; ?>

关键逻辑说明

  • 动态字段名生成:用"meal_{$i}"循环生成每个餐次的字段名,不用再逐个手写meal_1到meal_5,后续要加meal_6只需要把$meal_count改成6就行。
  • 双重判断条件:把你要求的$feeds_per_day >= 餐次编号和ACF组存在的判断合并,只有两个条件都满足才会渲染对应餐次的内容。
  • 代码复用:把原来重复5次的字段提取、数值计算逻辑放到循环里,减少冗余,后续修改运算规则只需要改一次代码。

注意事项

确保$feeds_per_day变量在这段代码执行前已经正确定义并赋值,不然判断逻辑会失效。如果你的餐次数量不是固定5个,也可以改成从ACF字段动态读取总数,但固定写死5个在你的场景里应该足够用了。

内容的提问来源于stack exchange,提问作者bboybeatle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:45:30