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
相关产品推荐
相关产品推荐

