在Woocommerce中根据运输类别和最低金额有条件地进行免费运输

时间:2018-11-12 09:07:24

标签: php wordpress woocommerce cart shipping-method

在woocommerce中,关于送货方式,我尝试具有以下条件:

  • 仅在购物车中的产品A:设置为“免运费”
  • 仅在购物车中的产品B:设置为:
    • 如果产品B的购买金额少于200,则统一费率金额为15
    • 如果购买产品B的数量达到200或更多,则免费送货。
  • 产品A +产品B同时在购物车中:“免费送货”,没有任何数量限制。

我已经尝试过使用统一费率和运费类别,我会发现如果产品A和产品B在那,那么如果购物车未达到200,就需要收取15运费。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

已更新:要使其首先生效,您需要:
-要添加“免费”运输类别(第一)
-要启用两种送货方式:“免费送货”和“统一费率”,
-在具有免费送货功能的产品中,需要设置“免费”送货类别
-在您的其他产品中,没有任何已定义的运输类别

1)对于“免费送货”方法,您将不会对其添加任何限制金额

2)对于“固定费率”送货方式,您将按照以下屏幕截图所示进行设置:

enter image description here

3)魔术将由下面的代码完成,其余将由代码完成:

add_filter('woocommerce_package_rates', 'conditional_free_shipping', 10, 2);
function conditional_free_shipping( $rates, $package ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;

    ## -- Your settings bellow -- ##

    $shipping_class  = 'free'; // "Free" shipping class products
    $min_free_amount = 200;    // Minimal Free shipping amount for normal products

    ## -- -- -- -- -- -- -- -- -- ##

    $has_free = false; // Initializing
    $products_total = 0; // Initializing

    // Loop through cart items
    foreach( $package['contents'] as $cart_item ) {
        if( $cart_item['data']->get_shipping_class() == $shipping_class ) {
            $has_free = true;
        } else {
            // Get the total purchased amount for normal product
            $products_total += $cart_item['line_total'] + $cart_item['line_tax'];
        }
    }

    foreach ( $rates as $rate_key => $rate ){
        // 1. Only Free shipping products in cart OR both products kind in cart
        if( $has_free ) {
            if( 'flat_rate' === $rate->method_id )
                unset( $rates[$rate_key] ); // Remove flat rate
        }
        // 2. Only normal products in cart
        else {
            // A. If it's under the min amount
            if( 'free_shipping' === $rate->method_id && $products_total < $min_free_amount )
                unset( $rates[$rate_key] ); // Remove Free shipping
            // B. When min amount is reached
            elseif( 'flat_rate' === $rate->method_id && $products_total >= $min_free_amount )
                unset( $rates[$rate_key] ); // Remove flat rate
        }
    }
    return $rates;
}

代码进入您的活动子主题(活动主题)的function.php文件中。经过测试,可以正常工作。

  

您可能需要刷新运输缓存的数据:在Woocommerce运输设置中禁用,保存和启用并保存当前运输区域的相关运输方法。

答案 1 :(得分:0)

我在代码上做了一些改进,现在可以正常工作了。

add_filter('woocommerce_package_rates', 'conditional_free_shipping', 10, 2);
function conditional_free_shipping( $rates, $package ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;

    ## -- Your settings bellow -- ##

    $shipping_class  = 'free'; // "Free" shipping class products
    $min_free_amount = 200;    // Minimal Free shipping amount for normal products

    ## -- -- -- -- -- -- -- -- -- ##

    $has_normal = $has_free = false; // Initializing
    $products_total = 0; // Initializing

    // Loop through cart items
    foreach( $package['contents'] as $cart_item ) {
        if( $cart_item['data']->get_shipping_class() == $shipping_class ) {
            $has_free = true;
        } else {
            $has_normal = true;
            // Get the total purchased amount for normal product
            $products_total += $cart_item['line_total'] + $cart_item['line_tax'];
        }
    }

    foreach ( $rates as $rate_key => $rate ){
        // 1. Only Free shipping products in cart
        if( $has_free && ! $has_normal ) {
            if( 'flat_rate' === $rate->method_id )
                unset( $rates[$rate_key] ); // Remove flat rate



        }

        elseif(( $has_free && $has_normal )){
             if( 'flat_rate' === $rate->method_id && $products_total <= $min_free_amount )
                unset( $rates[$rate_key] );
                }


        // 2. Only normal products in cart OR Both products kind in cart
        elseif( ( ! $has_free && $has_normal )  ) {
            // A. If it's under the min amount
            if( 'free_shipping' === $rate->method_id && $products_total < $min_free_amount )
                unset( $rates[$rate_key] ); // Remove Free shipping
            // B. When min amount is reached
            elseif( 'flat_rate' === $rate->method_id && $products_total >= $min_free_amount )
                unset( $rates[$rate_key] ); // Remove flat rate
        }
    }
    return $rates;
}