WooCommerce结账时剔除无配送方式商品不计入总价
WooCommerce 混合可/不可配送商品时自动剔除不可配送商品结算金额方案
不需要安装额外插件,直接把代码加到当前主题/子主题的functions.php文件末尾即可实现需求,代码逻辑做了兼容,不会破坏WooCommerce原生的单买不可配送商品时禁用支付的功能。
实现代码
// 非可配送区域结算时,自动将指定不可配送类商品从结算金额中剔除 add_action( 'woocommerce_before_calculate_totals', 'exclude_unshippable_items_from_total', 9999 ); function exclude_unshippable_items_from_total( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // 替换成你站点支持配送该特殊商品的本地国家/地区二位代码,国内站点填CN,美国站点填US即可 $shippable_country = 'CN'; if ( WC()->customer->get_shipping_country() === $shippable_country ) return; // 替换成你为不可海外配送商品创建的专属shipping class ID,和你原有代码里填的ID保持一致即可 $unshippable_class_id = 15; foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) { $product = $cart_item['data']; if ( $product->get_shipping_class_id() == $unshippable_class_id ) { // 将不可配送商品的结算价设为0,自动不计入购物车总价、小计 $cart_item['data']->set_price( 0 ); // 可选:给用户展示提示,可自行修改文案,不需要提示直接删除下面这行即可 wc_add_notice( sprintf( '商品「%s」不支持配送到您的当前地址,已自动从结算金额中移除', $product->get_name() ), 'notice' ); } } } // 兼容原有配送方式逻辑,避免可配送商品的运费计算异常 add_filter( 'woocommerce_package_rates', 'adjust_rates_for_mixed_cart', 9999, 2 ); function adjust_rates_for_mixed_cart( $rates, $package ) { $unshippable_class_id = 15; // 和上面的ID保持一致 $all_items_unshippable = true; foreach ( $package['contents'] as $item ) { if ( $item['data']->get_shipping_class_id() != $unshippable_class_id ) { $all_items_unshippable = false; break; } } // 仅当购物车全是不可配送商品时,才清空配送方式、触发原生禁用支付逻辑 if ( $all_items_unshippable ) { $rates = array(); } return $rates; }
参数修改说明
- 把
$shippable_country后面的国家代码改成你站点所属的、支持配送该特殊商品的地区代码即可,国内站点填CN,美国站点填US - 把两处
$unshippable_class_id后面的数字15,替换成你自己创建的不可配送商品对应的shipping class ID,ID可以在配送类编辑页面的URL参数里找到,和你之前查找ID的方式完全一致 - 用户提示文案可自行修改,不需要提示直接删除对应
wc_add_notice代码行即可,不影响核心功能
实现效果
- 海外用户购物车同时包含可配送商品、不可配送特殊商品时,特殊商品金额自动从结算总价中扣除,最终仅计算可配送商品的货款+对应运费,和你预期的59美元结算效果完全一致
- 购物车仅包含该不可配送商品时,完全保留WooCommerce原生逻辑:不生成配送选项、禁用支付按钮,无法完成结算
- 本地可配送区域用户购买该商品时,所有结算、配送逻辑完全正常,不受代码影响
- 代码无额外依赖,体量极轻,不会增加站点额外负载
内容的提问来源于stack exchange,提问作者LOTUSMS
相关产品推荐
相关产品推荐

