如何无需指定行名循环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
相关产品推荐
相关产品推荐

