在客户端 WooCommerce 网站中,订单金额不超过 250 时启用免费送货方式。我使用下面的代码(from 这个答案),当订单金额超过 250 时隐藏其他运费,除非购物车中有重物。
add_filter( 'woocommerce_package_rates', 'conditionally_hide_other_shipping_based_on_items_weight', 100, 1 );
function conditionally_hide_other_shipping_based_on_items_weight( $rates ) {
// targeted weight
$target_product_weight = 12;
$target_cart_amount = 250;
WC()->cart->subtotal_ex_tax >= $target_cart_amount ? $passed = true : $passed = false ;
// Iterating trough cart items to get the weight for each item
foreach(WC()->cart->get_cart() as $cart_item){
if( $cart_item['variation_id'] > 0)
$item_id = $cart_item['variation_id'];
else
$item_id = $cart_item['product_id'];
// Getting the product weight
$product_weight = get_post_meta( $item_id , '_weight', true);
if( !empty($product_weight) && $product_weight >= $target_cart_amount ){
$light_products_only = false;
break;
}
else $light_products_only = true;
}
// If 'free_shipping' method is available and if products are not heavy
// and cart amout up to the target limit, we hide other methods
$free = array();
foreach ( $rates as $rate_id => $rate ) {
if ( 'free_shipping' === $rate->method_id && $passed && $light_products_only ) {
$free[ $rate_id ] = $rate;
break;
}
}
return ! empty( $free ) ? $free : $rates;
}
但现在,我想设置一个可变的运费金额,该金额将通过两种方式计算:
- 当订单金额低于250时,将按订单总重量按每公斤1欧元计算。
- 当订单金额达到 250 时,仅按重件重量计算(每公斤 1 欧元)。如果没有重物,可以享受免运费。
我怎样才能实现这个目标,因为它有点复杂?
有什么踪迹可循吗?
我尝试过一些现有的相关插件,但它们对于这种情况并不方便。
Thanks.
代码改进 (2019年3月):
是的,无需自定义插件即可实现运输费用,根据购物车物品重量和购物车数量计算...但是您需要有一个'Flat rate'
邮寄方式设置最小量。这通常应该适用于您正在使用的代码。
这是代码(评论):
//Adding a custom Shipping Fee to cart based conditionaly on weight and cart amount
add_action('woocommerce_cart_calculate_fees', 'custom_conditional_shipping_fee', 10, 1);
function custom_conditional_shipping_fee( $cart ){
## --- YOUR SETTINGS --- ##
$targeted_weight = 20; // Your targeted "heavy" product weight
$targeted_cart_amount = 250; // Your targeted cart amount
$price_per_kg = 1; // Price by Kg;
$flat_rate_price = 10; // Set the cost like in 'flat rate' shipping method
// Initializing variables
$fee = $calculated_weight = 0;
// For cart SUBTOTAL amount EXCLUDING TAXES
$passed = $cart->subtotal_ex_tax >= $targeted_cart_amount ? true : false ;
// For cart SUBTOTAL amount INCLUDING TAXES (replace by this):
// $passed = $cart->subtotal >= $targeted_cart_amount ? true : false ;
// Iterating through each cart items
foreach( $cart->get_cart() as $cart_item ){
// The Product weight
$product_weight = $cart_item['data']->get_weight();
// cart item weight
$cart_item_weight = $cart_item['quantity'] * $cart_item['data']->get_weight();
// When cart amount is up to 250, Adding weight of heavy items
if($passed && $product_weight > $targeted_weight)
$calculated_weight += $cart_item_weight;
}
#### Making the fee calculation ####
// Cart is up to 250 with heavy items
if ( $passed && $calculated_weight != 0 ) {
// Fee is based on cumulated weight of heavy items
$fee = ( $calculated_weight * $price_per_kg ) - $flat_rate_price;
}
// Cart is below 250
elseif ( ! $passed ) {
// Fee is based on cart total weight
$fee = ( $cart->get_cart_contents_weight( ) * $price_per_kg ) - $flat_rate_price;
}
#### APPLYING THE CALCULATED FEE ####
// When cart is below 250 or when there is heavy items
if ($fee > 0){
// Rounding the fee
$fee = round( $fee );
// This shipping fee is taxable (You can have it not taxable changing last argument to false)
$cart->add_fee( __('Shipping weight fee', 'woocommerce'), $fee, true);
}
}
代码位于活动子主题(或主题)的 function.php 文件中或任何插件文件中。
这段代码已经过测试并且可以工作
从费用计算中减去最低“统一费率”金额,这样客户支付合适的价格.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)