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

如何在WooCommerce中将自定义保险费合并至运费?

问题:将WooCommerce保险费合并到运费中而非单独显示

我编写了一个WooCommerce函数,当客户发货至美国(US)和加拿大(CA)时,会根据购物金额添加保险费作为购物车自定义费用,该功能运行正常。但我无法实现将此费用合并到运费金额中,而非生成单独的行项目。

现有可运行代码

add_action( 'woocommerce_cart_calculate_fees', 'domestic_insurance_fee', 10, 1 );
function domestic_insurance_fee( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    
        $cou = array( 'US', 'CA' );
                
    // The cart total
    $cart_total = $cart->cart_contents_total; 
if ($cart_total)
{
if ($cart_total >= 5000)
    $prc = 1.25;
    elseif ($cart_total >= 4200)
    $prc = 1.27;
      elseif ($cart_total >= 3200)
    $prc = 1.33;
      elseif ($cart_total >= 2200)
    $prc = 1.37;
      elseif ($cart_total >= 1600)
    $prc = 1.43;
      elseif ($cart_total >= 1100)
    $prc = 1.47;
      elseif ($cart_total >= 800)
    $prc = 1.55;
      elseif ($cart_total >= 600)
    $prc = 1.65;
      elseif ($cart_total >= 400)
    $prc = 1.75;
      elseif ($cart_total >= 200)
    $prc = 1.85;
      elseif ($cart_total >= 1)
    $prc = 2;
}
else
{
  $prc = 2;
}

    // The conditional Calculation
    $feess = $cart_total * $prc / 100 ;
     if ( in_array( WC()->customer->get_shipping_country(),  $cou, true ) ) {

        $cart->add_fee( __( "Insurance", "woocommerce" ), $feess, false );
} }

尝试的无效代码

// The conditional Calculation
    $feess = $cart_total * $prc / 100 ;
    $ship_total = $cart->get_cart_shipping_total();
    $feeds = $ship_total + $feess;
     if ( in_array( WC()->customer->get_shipping_country(),  $cou, true ) ) {
$cart->set_shipping_total($feeds);
        
} }

解决思路与修改代码

直接调用$cart->set_shipping_total()无效的原因是:WooCommerce会在woocommerce_cart_calculate_fees钩子之后重新计算运费总额,你的修改会被系统覆盖。正确做法是直接修改选中的配送方式费用,而非购物车的总运费值。

修改后的完整代码

add_action( 'woocommerce_cart_calculate_fees', 'domestic_insurance_fee', 20, 1 );
function domestic_insurance_fee( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    
    $target_countries = array( 'US', 'CA' );
    $shipping_country = WC()->customer->get_shipping_country();
    
    // 仅针对目标国家处理
    if ( ! in_array( $shipping_country, $target_countries, true ) ) return;

    $cart_total = $cart->cart_contents_total;
    // 确定保险费率
    if ( $cart_total >= 5000 ) {
        $rate = 1.25;
    } elseif ( $cart_total >= 4200 ) {
        $rate = 1.27;
    } elseif ( $cart_total >= 3200 ) {
        $rate = 1.33;
    } elseif ( $cart_total >= 2200 ) {
        $rate = 1.37;
    } elseif ( $cart_total >= 1600 ) {
        $rate = 1.43;
    } elseif ( $cart_total >= 1100 ) {
        $rate = 1.47;
    } elseif ( $cart_total >= 800 ) {
        $rate = 1.55;
    } elseif ( $cart_total >= 600 ) {
        $rate = 1.65;
    } elseif ( $cart_total >= 400 ) {
        $rate = 1.75;
    } elseif ( $cart_total >= 200 ) {
        $rate = 1.85;
    } elseif ( $cart_total >= 1 ) {
        $rate = 2;
    } else {
        $rate = 2;
    }

    $insurance_fee = $cart_total * $rate / 100;

    // 遍历所有配送包裹,修改选中的配送方式费用
    foreach ( $cart->get_shipping_packages() as $package_key => $package ) {
        foreach ( $package['rates'] as $rate_key => $shipping_rate ) {
            // 仅修改用户选中的配送方式
            if ( $shipping_rate->is_selected() ) {
                // 获取原运费
                $original_cost = $shipping_rate->get_cost();
                // 计算含保险的新运费
                $new_cost = $original_cost + $insurance_fee;
                // 更新配送方式费用
                $shipping_rate->set_cost( $new_cost );
                
                // 可选:在配送标签后添加保险说明(比如显示"含保险")
                // $shipping_rate->set_label( $shipping_rate->get_label() . ' (含保险)' );
            }
        }
    }
}

关键修改点

  1. 钩子优先级调整:将钩子优先级从10改为20,确保在WooCommerce默认计算完运费后再执行修改,避免被系统覆盖。
  2. 操作具体配送方式:直接对用户选中的配送方式对象修改cost属性,这样最终显示的运费会自动包含保险费,不会生成单独行项目。
  3. 可选标签优化:如果需要让客户明确知道运费包含保险,可以取消注释标签修改代码,在配送方式名称后添加说明文字。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:06:26