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

WooCommerce购物车特定配送品类商品数量统计与配送方式隐藏功能优化求助

WooCommerce购物车特定配送品类商品数量统计与配送方式隐藏功能优化求助

嗨,我来帮你搞定这个问题!你的核心需求是统计购物车里所有属于配送类ID53的商品总数量,当总数超过2件时,隐藏“pack locker”(也就是代码里的inpost_paczkomaty:12)配送方式对吧?

先说说你现有代码的问题:

  • 你定义的$quantity变量只会保留最后一个购物车商品的数量,没有累加所有符合条件的商品数量
  • 第二个循环里的判断逻辑是逐个检查商品,只要某一个商品数量大于1就隐藏配送方式,这和你“总数量超过2才隐藏”的需求不匹配

下面是修改后的代码,我已经调整了逻辑,完美实现你的需求:

add_filter( 'woocommerce_package_rates', 'fanka_kodowania_hide_shipping_method1', 10, 2 );
function fanka_kodowania_hide_shipping_method1( $rates, $package ) {
    // 后台非AJAX请求直接返回,避免影响后台操作
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return $rates;
    }

    // 目标配送类ID
    $target_shipping_class = 53;
    // 需要隐藏的配送方式ID
    $method_key_ids = array('inpost_paczkomaty:12');
    
    // 初始化计数器,统计符合条件的商品总数量
    $total_target_items = 0;

    // 遍历购物车所有商品,累加符合条件的数量
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        // 检查当前商品的配送类是否匹配目标ID
        if ( $product->get_shipping_class_id() == $target_shipping_class ) {
            // 累加该商品的购买数量(比如用户买3件同一件商品,就加3)
            $total_target_items += $cart_item['quantity'];
        }
    }

    // 如果符合条件的商品总数量超过2,隐藏指定配送方式
    if ( $total_target_items > 2 ) {
        foreach( $method_key_ids as $method_key_id ){
            // 检查该配送方式是否存在,避免报错
            if ( isset( $rates[$method_key_id] ) ) {
                unset($rates[$method_key_id]);
            }
        }
    }

    return $rates;
}

我来解释下关键调整点:

  • 新增了$total_target_items变量,专门用来统计所有属于配送类53的商品总数量
  • 遍历购物车时,只要商品配送类匹配,就把该商品的购买数量累加到计数器里(考虑了用户买多件同商品的情况)
  • 最后统一判断总数量是否超过2,再执行隐藏操作,逻辑更准确
  • 增加了isset( $rates[$method_key_id] )的判断,避免因配送方式不存在导致的报错

记得修改代码后,要去WooCommerce的设置里刷新一下配送缓存(一般在配送方式设置页面,点击“保存更改”即可),这样新的代码才能生效哦!

备注:内容来源于stack exchange,提问作者Damian Mordarski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 13:17:35