如何在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() . ' (含保险)' ); } } } }
关键修改点
- 钩子优先级调整:将钩子优先级从10改为20,确保在WooCommerce默认计算完运费后再执行修改,避免被系统覆盖。
- 操作具体配送方式:直接对用户选中的配送方式对象修改
cost属性,这样最终显示的运费会自动包含保险费,不会生成单独行项目。 - 可选标签优化:如果需要让客户明确知道运费包含保险,可以取消注释标签修改代码,在配送方式名称后添加说明文字。
内容的提问来源于stack exchange,提问作者AKS
相关产品推荐
相关产品推荐

