WooCommerce:基于配送区域与购物车金额阈值显示动态消息报错求助
修复基于配送区域显示购物车消息的Woocommerce代码
原代码存在的问题
- 变量名不一致:定义了
$chosen_shipping_zone_id,却使用未定义的$chosen_shipping_method_id进行拆分,直接导致报错 - 获取配送区域的方式错误:
WC()->session->get('chosen_shipping_methods')返回的是配送方法ID,而非配送区域ID,无法通过拆分得到区域名称 - 逻辑判断不符合需求:原代码的条件逻辑混乱,未实现「区域1+金额<29显示文本1、区域2+金额<49显示文本2」的核心需求
- 消息内容固定:未根据不同条件切换对应的提示文本
修正后的代码
add_action( 'woocommerce_cart_totals_after_shipping', 'shipping_zone_based_cart_notice', 20 ); add_action( 'woocommerce_review_order_after_shipping', 'shipping_zone_based_cart_notice', 20 ); function shipping_zone_based_cart_notice() { // 避免重复输出 if ( did_action( 'woocommerce_cart_totals_after_shipping' ) >= 2 || did_action( 'woocommerce_review_order_after_shipping' ) >= 2 ) { return; } // 检查购物车和会话是否可用 if ( ! WC()->cart || ! WC()->session ) { return; } $chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' ); if ( empty( $chosen_shipping_methods ) ) { return; } $chosen_shipping_method_id = reset( $chosen_shipping_methods ); $shipping_method = WC_Shipping_Method::get_instance( $chosen_shipping_method_id ); // 获取当前配送区域名称 $shipping_zone = wc_get_shipping_zone( $shipping_method ); $shipping_zone_name = $shipping_zone->get_zone_name(); $cart_subtotal = WC()->cart->subtotal; $message = ''; // 根据需求设置条件和对应文本 if ( $shipping_zone_name === '配送区域1' && $cart_subtotal < 29 ) { $message = '文本1:满29欧元即可享受优惠配送'; // 替换为实际文本1 } elseif ( $shipping_zone_name === '配送区域2' && $cart_subtotal < 49 ) { $message = '文本2:满49欧元即可免运费'; // 替换为实际文本2 } // 输出消息 if ( ! empty( $message ) ) { echo '</tr><tr class="shipping-notice"><th> </th><td data-title="配送提示">' . esc_html( $message ) . '</td>'; } }
代码说明
- 变量修正:统一变量命名,消除未定义变量报错
- 正确获取配送区域:通过
wc_get_shipping_zone()方法,从选中的配送方法对象中获取所属区域名称 - 逻辑匹配需求:明确判断「配送区域+购物车金额」的组合条件,分别设置对应提示文本
- 安全输出:使用
esc_html()确保文本输出安全,避免XSS风险 - 兼容性检查:增加购物车和会话的可用性检查,避免异常场景报错
注意事项
- 将代码中的
'配送区域1'和'配送区域2'替换为你后台实际设置的配送区域名称 - 替换
'文本1:...'和'文本2:...'为你需要显示的自定义提示内容 - 代码需添加到主题的
functions.php文件或自定义插件中
内容的提问来源于stack exchange,提问作者Miri
相关产品推荐
相关产品推荐

