沃梦达 / 编程问答 / php问题 / 正文

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

Shipping calculated on cart items weight and cart amount(根据购物车物品重量和购物车数量计算运费)

本文介绍了根据购物车物品重量和购物车数量计算运费的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在客户端 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 欧元/公斤.
  • 当订单金额达到 250 件时,将仅计算重件重量(1 欧元/公斤).如果没有重物,可享受免费送货服务.

我怎样才能做到这一点,因为它有点复杂?
有什么要跟踪的吗?

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 月):

是的,如果没有带有自定义运费的插件,这是可能的,根据购物车物品重量和购物车数量计算......但您需要有一个'Flat rate' 运输方式设置最低数量.这通常应该适用于您正在使用的代码.

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

从费用计算中减去最小的统一费率"金额,这样客户支付正确的价格.

The minimal 'Flat rate' amount is subtracted from the fee calculation, this way the customer pay the right price.

这篇关于根据购物车物品重量和购物车数量计算运费的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:根据购物车物品重量和购物车数量计算运费

基础教程推荐