如何修复Woocommerce结账Box3调用ACF选项字段显示问题
问题:ACF选项页字段无法在结账页面Box#3正常显示
我们售卖名为“Culture Boxes”的餐盒订阅服务,同时提供单次购买的单盒产品,购物车可同时包含订阅产品与多个单次购买产品。在结账页面表单前设置了条件性通知盒:
- Box#1:购物车含订阅产品时显示
- Box#2:购物车含单次购买产品时显示
- Box#3:需展示从后台ACF选项页字段组获取的下一次配送日/月/日期,但当前代码无法正常工作
已实现的Box#1和Box#2代码:
add_action( 'woocommerce_before_checkout_form', 'jbc_list_subs_note1', 12 ); function jbc_list_subs_note1() { // set your products IDs here: $product_ids = array(16773); $bool = false; foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $item = $cart_item['data']; if ( in_array( $item->id, $product_ids ) ) $bool = true; } // If the special ID is detected in one items of the cart // It displays the message if ($bool) echo '<div class="jbc-check-subs-note1"> <div class="jbc-check-subs-note1-div1"> <p class="jbc-check-subs-note-txt-top-s">You'll receive</p> </div> <div class="jbc-check-subs-note1-div2"> <p class="jbc-check-subs-note-text-mid-l"> 1 Culture Box</p> </div> <div class="jbc-check-subs-note1-div1"> <p class="jbc-check-subs-note-txt-top-s">each month until you cancel.</p> </div> </div>'; } add_action( 'woocommerce_before_checkout_form', 'jbc_list_subs_note2', 12 ); function jbc_list_subs_note2() { // set your special category name, slug or ID here: $special_cat = '168'; $bool = false; foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) { $item = $cart_item['data']; if ( has_term( $special_cat, 'product_cat', $item->id ) ) $bool = true; } // If the special cat is detected in one items of the cart // It displays the message if ($bool) echo '<div class="jbc-check-subs-note2"> <div class="jbc-check-subs-note1-div1"> <p class="jbc-check-subs-note-txt-top-s">You are ordering our</p> </div> <div class="jbc-check-subs-note2-div2"> <p class="jbc-check-subs-note-text-mid-l">Featured Box</p> </div> <div class="jbc-check-subs-note1-div1"> <p class="jbc-check-subs-note-txt-top-s">as a one-time purchase.</p> </div> </div>'; }
当前无法正常工作的Box#3代码:
<?php add_action( 'woocommerce_before_checkout_form', 'jbc_list_subs_note3', 12 ); function jbc_list_subs_note3() { echo '<div class="jbc-check-subs-note2"> <div class="jbc-check-subs-note1-div1"> <p class="jbc-check-subs-note-txt-top-s">Our next deliveries are scheduled for</p> </div> <div class="jbc-check-subs-note2-div2"> <?php $Delivery = get_field('JBC_order_delivery'); if( $Delivery ): ?> <div id="Delivery"> <?php if ( have_rows( 'JBC_order_delivery', 'option' ) ) : ?> <?php while ( have_rows( 'JBC_order_delivery', 'option' ) ) : the_row(); ?> <?php the_sub_field( 'JBC_order_delivery-day' ); ?> <?php the_sub_field( 'JBC_order_delivery-month' ); ?> <?php the_sub_field( 'JBC_order_delivery-date' ); ?> <?php endwhile; ?> <?php endif; ?> </div> <div class="jbc-check-subs-note1-div1"> <p class="jbc-check-subs-note-txt-top-s">via courier</p> </div> </div>'; }
解决方案
原Box#3代码存在3个核心语法与逻辑错误,修正后的代码如下:
add_action( 'woocommerce_before_checkout_form', 'jbc_list_subs_note3', 12 ); function jbc_list_subs_note3() { // 初始化配送信息HTML $delivery_html = ''; // 从ACF选项页获取重复字段组,必须指定'option'参数 if ( have_rows( 'JBC_order_delivery', 'option' ) ) { $delivery_html .= '<div id="Delivery">'; while ( have_rows( 'JBC_order_delivery', 'option' ) ) { the_row(); // 获取子字段并格式化输出(可根据需求调整分隔符) $day = get_sub_field('JBC_order_delivery-day'); $month = get_sub_field('JBC_order_delivery-month'); $date = get_sub_field('JBC_order_delivery-date'); if ($day && $month && $date) { $delivery_html .= sprintf('%s %s %s', $day, $month, $date); // 如果有多个配送日期,可添加分隔符,比如:$delivery_html .= '<br>'; } } $delivery_html .= '</div>'; } // 只有当获取到配送信息时才输出整个通知盒(可选,根据需求调整) if (!empty($delivery_html)) { echo '<div class="jbc-check-subs-note3"> <div class="jbc-check-subs-note1-div1"> <p class="jbc-check-subs-note-txt-top-s">Our next deliveries are scheduled for</p> </div> <div class="jbc-check-subs-note2-div2">'; echo $delivery_html; echo ' </div> <div class="jbc-check-subs-note1-div1"> <p class="jbc-check-subs-note-txt-top-s">via courier</p> </div> </div>'; } }
关键修改点说明
- 移除嵌套PHP标签:原代码在
echo语句里嵌套了<?php ?>标签,这是语法错误,直接在函数内部处理ACF逻辑即可。 - 正确调用ACF选项页字段:使用
have_rows('字段名', 'option')时必须传入第二个参数option,否则无法读取选项页的字段;同时替换the_sub_field为get_sub_field来获取值,方便拼接HTML。 - 优化输出逻辑:先构建配送信息的HTML片段,再整合到通知盒的结构中,避免输出不完整的HTML;增加判断,只有当存在配送信息时才显示整个Box#3。
- 调整类名:将Box#3的外层类名改为
jbc-check-subs-note3,避免和Box#2的类名冲突,方便后续样式定制。
内容的提问来源于stack exchange,提问作者Just Be Cooking
相关产品推荐
相关产品推荐

