1

配送方法に関するwoocommerceでは、次のことを試みています。

  • 商品Aのみカート内:「送料無料」で設定
  • 商品 B のみカートに入れる: セット内容:
    • 商品Bの購入金額が200円未満の場合は定額15円
    • 商品Bの購入金額が200枚以上で送料無料。
  • 商品A+商品Bを同時にカートに入れる:数量制限なしの「送料無料」。

商品Aと商品Bがそこにある場合、カートが200に達しない場合、15の配送料がかかるようになります。

どんな助けでも大歓迎です。

4

2 に答える 2

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;
}
于 2018-11-12T14:00:24.587 に答える