【问题标题】:Shipping calculated on cart items weight and cart amount运费根据购物车物品重量和购物车金额计算
【发布时间】:2017-02-22 16:16:15
【问题描述】:

在客户 WooCommerce 网站中,订单金额高达 250 的免费送货方式启用。我使用下面的代码(来自this answer,在订单金额时隐藏其他运费超过 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 欧元/公斤)。如果没有重物,可享受免运费服务。

我怎样才能做到这一点,因为它有点复杂?
有什么可以追的吗?

我已经尝试了一些现有的相关插件,但它们不适合这种情况。

谢谢。

【问题讨论】:

    标签: php wordpress woocommerce cart checkout


    【解决方案1】:

    代码改进 (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 文件或任何插件文件中。

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

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

    【讨论】:

    • 非常感谢!
    • 当我说这是替换 Table Rate Shipping 插件功能时是否正确?
    • 我想要相同的代码,但是当重量超过 10 公斤时,我们收费,以下任何东西都是免费的。当订单总额低于 20 美元时,我们收取 5 美元
    • @Solomax ...第一条评论:对不起,我没听懂...第二条评论:您应该先尝试更改代码以获得您想要的东西...如果您无法正常工作,请询问新的链接到此答案线程的问题,添加您修改后的代码意图和必要的解释。
    猜你喜欢
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2022-12-29
    • 1970-01-01
    • 2013-06-29
    • 2015-06-01
    相关资源
    最近更新 更多