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

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;
}

关键修改说明

  1. 正确获取购物车商品:用$package['contents']遍历当前包裹的商品,这是WooCommerce钩子里获取商品的标准方式
  2. 优化分类检查:用array_intersect直接判断商品分类和目标分类是否有交集,代码更简洁,找到符合条件的商品后立刻跳出循环,提升效率
  3. 统一处理配送方式:把需要修改的配送方式key放到数组里循环处理,避免重复的if判断代码
  4. 处理税费和缓存:如果配送方式包含税费,同步乘以乘数;同时设置_modified元数据,避免WooCommerce的费率缓存导致修改不生效
  5. 简化乘数获取:用?:运算符简化默认值的设置,让代码更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:18:05