Условная бесплатная доставка в зависимости от класса доставки и минимальной суммы в Woocommerce - PullRequest
0 голосов
/ 12 ноября 2018

В woocommerce, касающемся способов доставки, я пытаюсь получить следующее:

  • Товары A только в корзине: комплект с "Бесплатная доставка"
  • Товар B только в корзине: комплект с:
    • Единая ставка в размере 15, если сумма закупленной продукции B меньше 200
    • Бесплатная доставка, если количество приобретенной продукции B достигает 200 и более ..
  • Товары A + Товары B находятся в корзине одновременно: «Бесплатная доставка» без каких-либо ограничений.

Я пытался использовать фиксированную ставку и классы доставки, которые у меня возникают, если продукт A и продукт B есть, тогда, если корзина не достигает 200, он берет 15-ю стоимость доставки.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Я сделал некоторые улучшения в коде, теперь он работает нормально ..

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;
}
0 голосов
/ 12 ноября 2018

Обновлено: Для того, чтобы оно заработало, вам понадобится:
- Чтобы добавить «Бесплатная» класс доставки (первый) ,
- Чтобы включить 2 способа доставки: «Бесплатная доставка» и «Единый тариф»,
- В ваших товарах с бесплатной доставкой нужно будет установить с классом доставки «Свободно» ,
- В другом вашем продукте не будет иметь определенного класса доставки .

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 вашей активной дочерней темы (active theme). Проверено и работает.

Возможно, вам потребуется обновить кэшированные данные доставки: отключить, сохранить и включить, сохранить связанные способы доставки для текущей зоны доставки в настройках доставки Woocommerce.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...