WooCommerce库存不足时隐藏付费快递配送选项的适配方案
WooCommerce 按商品库存状态控制配送方式显示
需求回顾
- 已配置两种配送方式:
- 付费48小时快递(按购物车总额百分比计费)
- 免费29天普通配送
- 规则要求:
- 购物车中存在**任一库存≤0(预售)**或库存不足以覆盖购买数量的商品时,隐藏付费快递,仅显示免费配送
- 所有商品库存充足时,显示两种配送方式
适配通用环境的解决方案
原代码依赖第三方插件的配送方式标识,以下是适配原生WooCommerce的修改版代码,无需依赖外部插件:
1. 先获取你的付费快递配送方式ID
要准确移除目标配送方式,需先获取其ID:
- 登录WooCommerce后台,进入「配送」→ 对应配送方式的编辑页面
- 查看浏览器地址栏,类似
wp-admin/post.php?post=123&action=edit中的post=123,123就是该配送方式的ID - 或者临时添加以下代码到主题
functions.php,在结算页查看所有可用配送方式的ID和名称:
add_action('woocommerce_before_cart', 'print_shipping_method_ids'); function print_shipping_method_ids() { if (WC()->cart->needs_shipping()) { $shipping_methods = WC()->shipping()->get_shipping_methods(); echo '<pre>'; foreach ($shipping_methods as $method) { echo 'ID: ' . $method->id . ' | 名称: ' . $method->title . '<br>'; } echo '</pre>'; } }
添加后访问购物车/结算页,就能看到所有配送方式的ID信息,获取后即可删除这段临时代码。
2. 最终功能代码
将以下代码添加到主题的functions.php文件,或使用代码片段插件:
/* 根据商品库存状态隐藏付费配送方式 */ add_filter('woocommerce_available_shipping_methods', 'hide_paid_shipping_for_oos_items', 10, 1); // 检查购物车是否存在库存不足/预售商品 function has_oos_items_in_cart() { $has_oos = false; // 遍历购物车商品 foreach (WC()->cart->get_cart() as $cart_item) { $product = $cart_item['data']; $stock_qty = $product->get_stock_quantity(); $cart_qty = $cart_item['quantity']; // 条件:库存≤0(预售) 或 购买数量超过现有库存 if ($stock_qty <= 0 || $cart_qty > $stock_qty) { $has_oos = true; break; } } return $has_oos; } // 过滤可用配送方式 function hide_paid_shipping_for_oos_items($available_methods) { // 替换成你获取到的付费快递配送方式ID $paid_shipping_id = 'YOUR_PAID_SHIPPING_METHOD_ID'; // 如果购物车存在库存不足商品,移除付费配送方式 if (has_oos_items_in_cart() && isset($available_methods[$paid_shipping_id])) { unset($available_methods[$paid_shipping_id]); } return $available_methods; }
代码说明
has_oos_items_in_cart():遍历购物车所有商品,检查是否符合库存不足/预售的条件,返回布尔值hide_paid_shipping_for_oos_items():通过woocommerce_available_shipping_methods过滤器,当满足条件时移除指定的付费配送方式- 代码使用
WC()->cart替代原代码的global $woocommerce,符合WooCommerce最新开发规范
内容的提问来源于stack exchange,提问作者user20411816
相关产品推荐
相关产品推荐

