You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于购物车商品库存状态修改WooCommerce配送方式标签

解决方案:根据购物车商品库存状态修改WooCommerce配送标签

问题分析

你之前的两段代码存在以下问题:

  1. 第一段代码在woocommerce_cart_item_name钩子内重复绑定woocommerce_cart_shipping_method_full_label钩子,购物车每有一件商品就会触发一次绑定,导致标签重复输出;且仅处理了“需订购”状态,未覆盖所有规则。
  2. 第二段代码错误地给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;
}

代码说明

  1. 辅助函数get_cart_highest_stock_status:遍历购物车所有商品,按「需订购>库存有限>有货」的优先级判断当前购物车的库存状态类型,避免重复判断逻辑。
  2. 钩子函数custom_shipping_method_label_based_on_stock:
    • 调用辅助函数获取购物车的库存状态
    • 根据状态和配送方式ID匹配对应的标签文本
    • 将额外文本以小号灰色字体追加到原配送标签后,符合视觉展示需求

注意事项

  • 确保库存状态的slug与代码中一致:onbackorder对应“需订购”,stock_limitado对应“库存有限”,instock对应“有货”,如果你的店铺实际slug不同,需修改对应值。
  • 配送方式IDfish_n_ships:62和fish_n_ships:63需与你店铺中的实际ID匹配,可通过WooCommerce后台或浏览器开发者工具查看。

内容的提问来源于stack exchange,提问作者Telma Alves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:17:04