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
相关产品推荐
相关产品推荐

