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

如何修复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&#39;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>';
    }
}

关键修改点说明

  1. 移除嵌套PHP标签:原代码在echo语句里嵌套了<?php ?>标签,这是语法错误,直接在函数内部处理ACF逻辑即可。
  2. 正确调用ACF选项页字段:使用have_rows('字段名', 'option')时必须传入第二个参数option,否则无法读取选项页的字段;同时替换the_sub_field为get_sub_field来获取值,方便拼接HTML。
  3. 优化输出逻辑:先构建配送信息的HTML片段,再整合到通知盒的结构中,避免输出不完整的HTML;增加判断,只有当存在配送信息时才显示整个Box#3。
  4. 调整类名:将Box#3的外层类名改为jbc-check-subs-note3,避免和Box#2的类名冲突,方便后续样式定制。

内容的提问来源于stack exchange,提问作者Just Be Cooking

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 18:38:12