根据购物车物品重量和购物车数量计算的运费

编程入门 行业动态 更新时间:2024-10-25 06:22:54
本文介绍了根据购物车物品重量和购物车数量计算的运费的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

在客户WooCommerce网站上,订单金额达到250的订单启用了免费送货方式。我使用下面的代码(来自此答案),以在订单金额超过250时隐藏其他运费,除非订单过多

In a client WooCommerce web site, free shipping method is enabled for orders amount up to 250. I use the code below (from this answer), to hide other shipping rates when the order amount is over 250, except when there is heavy items in cart.

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

但是现在,我想设置一个可变的运费,该运费将被计算

But now, I would like to set a variable shipping amount that will be calculated in 2 ways:

  • 当订购量低于250时,将按订购商品总重量的每千克1欧元计算。
  • When order amount is below 250, the calculation will be 1 euro by kilo on the total order items weight.
  • When order amount is up to 250, the calculation will be made on heavy items weight only (1 euro by kilo). If there is not heavy items, the free shipping rate is available.

由于有点复杂,我该如何实现? 有什么可追踪的地方吗?

How can I achieve this, as it’s a bit complicated? Any track to follow?

我已经尝试了一些现有的相关插件,但是在这种情况下它们并不方便。

I have tried some existing related plugins, but they aren't convenient for this case.

谢谢。

推荐答案

代码已改进 (在2019年3月):

是的,如果没有带有自定义 SHIPPING FEE 的自定义插件的按商品重量和购物车计算,这是可能的数量…,但您需要设置 固定费率 的运输方式最低金额。

Yes this is possible without a plugin with a custom SHIPPING FEE, calculated on cart items weight and cart amount… But you will need to have a 'Flat rate' shipping method set with a minimal amount. This normally should work with the code you are using.

这里是代码(注释):

//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文件您的活动子主题(或主题)或任何插件文件中。

此代码已经过测试,可以正常工作

This code is tested and it works

从费用计算中减去最小的固定费率金额,这样客户支付正确的价格。

更多推荐

根据购物车物品重量和购物车数量计算的运费

本文发布于:2023-11-30 01:12:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1648222.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:购物车   运费   重量   数量   物品

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!