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

Woocommerce多配送区域免运费提示兼容Ajax数量更新问题

解决WooCommerce购物车数量Ajax更新后免运费提示消失的问题

问题根源

原代码仅绑定了woocommerce_before_mini_cart_contents钩子,而迷你购物车通过Ajax更新时该钩子不会重新执行,导致提示消失。同时原代码还存在变量判断错误、配送方式获取逻辑不准确的问题,需一并修正。

修改后的完整代码

// 初始加载/页面刷新时显示免运费提示
add_action( 'woocommerce_before_mini_cart_contents', 'display_free_shipping_cart_notice_zones' );
// Ajax刷新购物车时同步更新提示
add_action( 'woocommerce_refresh_fragments', 'display_free_shipping_cart_notice_zones' );

function display_free_shipping_cart_notice_zones() {
    // 获取当前用户所在配送区域的配送方式
    $shipping_package = WC()->session->get('shipping_for_package_0');
    if ( empty($shipping_package['rates']) ) return;

    $min_amounts = array();
    // 遍历当前区域配送方式,提取免运费最低金额
    foreach( $shipping_package['rates'] as $rate ) {
        $method = $rate->get_method();
        if ( method_exists($method, 'min_amount') && $method->min_amount > 0 ) {
            $min_amounts[] = $method->min_amount;
        }
    }

    if ( empty($min_amounts) ) return;

    // 取当前区域最低免运费门槛
    $min_amount = min($min_amounts);
    // 获取购物车小计(不含运费、含税)
    $current_subtotal = WC()->cart->subtotal;

    // 清空旧提示,避免重复堆积
    wc_clear_notices();

    // 提示逻辑
    if ( $current_subtotal < $min_amount ) {
        $remaining = wc_price( $min_amount - $current_subtotal );
        $added_text = "再买{$remaining}即可享受免运费!";
        $return_to = wc_get_page_permalink( 'shop' );
        $notice = sprintf( '<a href="%s" class="button wc-forward">继续购物</a> %s', esc_url( $return_to ), $added_text );
        wc_print_notice( $notice, 'notice' );
    } elseif ( $current_subtotal >= $min_amount ) {
        $added_text = "恭喜!您已满足免运费条件,配送费全免 :)";
        wc_print_notice( $added_text, 'notice' );
    }
}

关键修改说明

  • 新增Ajax兼容钩子:绑定woocommerce_refresh_fragments钩子,该钩子会在迷你购物车Ajax刷新时触发,确保提示同步更新。
  • 修正配送方式获取逻辑:改用WC()->session->get('shipping_for_package_0')获取当前用户所在区域的配送方式,适配多区域多货币场景,而非全局所有配送方式。
  • 修复变量判断错误:将原代码中用数组$min_amounts的错误比较,改为用提取出的最小值$min_amount;同时将赋值符号=改为比较符号>=,逻辑更准确。
  • 添加旧提示清空:用wc_clear_notices()避免Ajax刷新后提示重复堆积。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:05:13