WooCommerce基于产品类别的运费乘数未生效问题求助
修复WooCommerce配送费用乘数不生效的问题
我帮你找出了代码里的几个关键问题,正是这些问题导致乘数没有生效。咱们一步步来修复:
原代码的核心问题
- 未正确获取购物车商品:你用了
foreach( $products as $cart_item ),但$products变量根本没定义,WooCommerce的woocommerce_package_rates钩子里,购物车商品是存在$package['contents']里的 - 分类检查逻辑错误:
wc_get_product_term_ids的调用位置不对,应该在每个购物车商品的循环内部,去获取当前商品的分类ID,而不是在循环外调用(而且你循环外的$product_id也是未定义的) - 分类判断的效率问题:原代码的分类检查循环没有提前终止,只要找到一个符合条件的商品就可以直接标记为true并跳出循环,没必要继续遍历
修复后的代码
add_filter( 'woocommerce_package_rates','overwrite_shipping_cost', 100, 2 ); function overwrite_shipping_cost($rates, $package ) { // 获取乘数,默认值设为1 $multiplier = get_field( 'multiplier', 'option' ) ?: 1; // 指定需要触发乘数的产品分类ID $target_cat_ids = array( 86, 21, 47 ); $has_target_cat = false; // 遍历当前包裹里的所有购物车商品 foreach( $package['contents'] as $cart_item ){ $product = $cart_item['data']; // 获取当前商品的所有分类ID $product_cat_ids = wc_get_product_term_ids( $product->get_id(), 'product_cat' ); // 检查当前商品是否属于目标分类,有交集就标记为true并终止循环 if ( array_intersect( $target_cat_ids, $product_cat_ids ) ) { $has_target_cat = true; break; } } // 如果不是后台且存在目标分类商品,应用乘数 if ( ! is_admin() && $has_target_cat ) { // 把需要修改的配送方式key统一放到数组里,避免重复代码 $target_rates = array( 'shiptor-shiptor:14:delivery-point_shiptor_terminal', 'shiptor-shiptor:14:to-door_shiptor_courier', 'rpaefw_post_calc:16' ); foreach( $target_rates as $rate_key ){ if ( isset( $rates[$rate_key] ) ) { // 应用运费乘数 $rates[$rate_key]->cost = $rates[$rate_key]->cost * $multiplier; // 同步更新税费(如果存在的话) if ( $rates[$rate_key]->taxes ) { foreach( $rates[$rate_key]->taxes as $key => $tax ){ $rates[$rate_key]->taxes[$key] = $tax * $multiplier; } } // 标记费率已修改,避免WooCommerce的缓存导致修改不生效 $rates[$rate_key]->set_meta_data( '_modified', true ); } } } return $rates; }
关键修改说明
- 正确获取购物车商品:用
$package['contents']遍历当前包裹的商品,这是WooCommerce钩子里获取商品的标准方式 - 优化分类检查:用
array_intersect直接判断商品分类和目标分类是否有交集,代码更简洁,找到符合条件的商品后立刻跳出循环,提升效率 - 统一处理配送方式:把需要修改的配送方式key放到数组里循环处理,避免重复的if判断代码
- 处理税费和缓存:如果配送方式包含税费,同步乘以乘数;同时设置
_modified元数据,避免WooCommerce的费率缓存导致修改不生效 - 简化乘数获取:用
?:运算符简化默认值的设置,让代码更简洁
内容的提问来源于stack exchange,提问作者ADv
相关产品推荐
相关产品推荐

