基于购物车商品库存状态修改WooCommerce配送方式标签
解决方案:根据购物车商品库存状态修改WooCommerce配送标签
问题分析
你之前的两段代码存在以下问题:
- 第一段代码在
woocommerce_cart_item_name钩子内重复绑定woocommerce_cart_shipping_method_full_label钩子,购物车每有一件商品就会触发一次绑定,导致标签重复输出;且仅处理了“需订购”状态,未覆盖所有规则。 - 第二段代码错误地给
woocommerce_cart_shipping_method_full_label钩子声明了3个参数(该钩子实际仅接收$label和$method两个参数),调用不存在的$cart_item参数直接引发致命错误;同时未遍历整个购物车判断库存状态,逻辑不完整。
正确代码实现
// 辅助函数:判断购物车的最高优先级库存状态 function get_cart_highest_stock_status() { $has_backorder = false; $has_limited_stock = false; // 遍历购物车所有商品 foreach (WC()->cart->get_cart() as $cart_item) { $stock_status = $cart_item['data']->get_stock_status(); // 标记是否有需订购商品(优先级最高) if ($stock_status === 'onbackorder') { $has_backorder = true; break; // 只要有一个就无需继续判断 } // 标记是否有库存有限商品 elseif ($stock_status === 'stock_limitado') { $has_limited_stock = true; } } // 返回优先级最高的状态 if ($has_backorder) { return 'backorder'; } elseif ($has_limited_stock) { return 'limited'; } else { return 'instock'; } } // 修改配送方式标签 add_filter('woocommerce_cart_shipping_method_full_label', 'custom_shipping_method_label_based_on_stock', 10, 2); function custom_shipping_method_label_based_on_stock($label, $method) { $cart_status = get_cart_highest_stock_status(); $additional_text = ''; // 根据库存状态和配送方式ID设置对应文本 switch ($cart_status) { case 'backorder': // 需订购状态:两个配送方式统一显示48/72h $additional_text = __('48/72h', 'woocommerce'); break; case 'limited': // 库存有限状态:区分配送方式设置文本 if ($method->id === 'fish_n_ships:62') { $additional_text = __('24/48h', 'woocommerce'); } elseif ($method->id === 'fish_n_ships:63') { $additional_text = __('48/72h', 'woocommerce'); } break; case 'instock': // 全有货状态:显示统一文本 $additional_text = __('Shipping by 4pm', 'woocommerce'); break; } // 拼接额外文本到原标签 if (!empty($additional_text)) { $label .= '<br><small style="color:#777777">' . $additional_text . '</small>'; } return $label; }
代码说明
- 辅助函数
get_cart_highest_stock_status:遍历购物车所有商品,按「需订购>库存有限>有货」的优先级判断当前购物车的库存状态类型,避免重复判断逻辑。 - 钩子函数
custom_shipping_method_label_based_on_stock:- 调用辅助函数获取购物车的库存状态
- 根据状态和配送方式ID匹配对应的标签文本
- 将额外文本以小号灰色字体追加到原配送标签后,符合视觉展示需求
注意事项
- 确保库存状态的slug与代码中一致:
onbackorder对应“需订购”,stock_limitado对应“库存有限”,instock对应“有货”,如果你的店铺实际slug不同,需修改对应值。 - 配送方式ID
fish_n_ships:62和fish_n_ships:63需与你店铺中的实际ID匹配,可通过WooCommerce后台或浏览器开发者工具查看。
内容的提问来源于stack exchange,提问作者Telma Alves
相关产品推荐
相关产品推荐

