Условно скрывать методы доставки WooCommerce на основе класса доставки


Использование WooCommerce v3.2.4 на Этом сайте (здесь) (WP v4.9) и 11 товаров с классом доставки избыточного веса/негабарита, к которым применяется фиксированная ставка:
$20 в Канаду и $25 в США.

Все остальные продукты имеют фиксированную стоимость доставки $10 ( Канада) и $15 ( США), если только заказ не закончен $100, затем бесплатная доставка применяется автоматически.

Мой клиент хочет, чтобы бесплатная доставка была отключена если в корзине есть какие-либо товары с избыточным весом/негабаритные товары. Проблема в том, что в корзине указано, что нет доступных способов доставки, когда в корзине есть смесь обычных и негабаритных товаров, и методы доставки не применяются.

Я использую Плагин Xadapter Woocommerce Shipping Table Rate, чтобы применить более высокую стоимость к классам доставки с "избыточным весом".

ОБНОВЛЕНИЕ

Я деактивировал этот плагин, так как понял, что могу просто использовать WooCommerce Настройки зоны доставки для установки фиксированной ставки для определенных классов доставки. Смотрите скриншот ниже: Flat Rate Settings for one of my shipping zones

Я использую некоторый код для:

  • скрыть бесплатную доставку и фиксированные тарифы, если в корзине есть класс доставки "С избыточным весом"
  • скрыть способ доставки "С избыточным весом", если этот класс не существует (163 - идентификатор класса доставки)...

Вот этот код:

add_filter('woocommerce_package_rates', 'wf_hide_shipping_method_based_on_shipping_class', 100, 2);

function wf_hide_shipping_method_based_on_shipping_class($available_shipping_methods, $package){
    $hide_when_shipping_class_exist = array(
        163 => array(
            'flat_rate:1',
            'flat_rate:2',
            'free_shipping:3',
            'free_shipping:5'
        )
    );

    $hide_when_shipping_class_not_exist = array(
        163 => array( 'wf_woocommerce_shipping_pro:overweightoversizeoverweight')
    );

    $shipping_class_in_cart = array();
    foreach(WC()->cart->cart_contents as $key => $values) {
       $shipping_class_in_cart[] = $values['data']->get_shipping_class_id();
    }

    foreach($hide_when_shipping_class_exist as $class_id => $methods) {
        if(in_array($class_id, $shipping_class_in_cart)){
            foreach($methods as & $current_method) {
                unset($available_shipping_methods[$current_method]);
            }
        }
    }

    foreach($hide_when_shipping_class_not_exist as $class_id => $methods) {
        if(!in_array($class_id, $shipping_class_in_cart)){
            foreach($methods as & $current_method) {
                unset($available_shipping_methods[$current_method]);
            }
        }
    }
    return $available_shipping_methods;
}

РЕДАКТИРОВАТЬ

Вот список идентификаторов тарифов для каждой зоны доставки:

Канада

  • Обычная фиксированная ставка |идентификатор: flat_rate:1
  • Бесплатная доставка |Идентификатор: free_shipping:3
  • Местный пикап |идентификатор: local_pickup:4

США

  • Обычная фиксированная ставка |идентификатор: flat_rate:2
  • Бесплатная доставка |Идентификатор: free_shipping:5
Author: The Hatchery, 2017-11-19

1 answers

ОБНОВЛЕНИЕ 2: ( Без каких-либо плагинов, просто настройки и код)

Функция ниже всегда будет отображать доставку "Местный самовывоз" для Канады и будет:

  1. Скрыть способы бесплатной доставки, если в товарах корзины указан класс доставки "Негабаритный". Для способов доставки по фиксированной ставке стоимость будет установлена для класса доставки "Негабаритный".
  2. если в товарах корзины не указан класс доставки "Негабаритный":
    • Если сумма корзины меньше целевой сумма бесплатной доставки: Скрыть "Бесплатная доставка".
    • Если сумма в корзине превышает целевую сумму бесплатной доставки: Скройте способы доставки по фиксированной ставке.

Вот этот код:

add_filter('woocommerce_package_rates', 'wf_hide_shipping_method_based_on_shipping_class', 100, 2);
function wf_hide_shipping_method_based_on_shipping_class($rates, $package){

    // Defining & Initializing variables
    $free_shipping_rates = array(
        'free_shipping:3',
        'free_shipping:5'
    );

    // Defining & Initializing variables
    $shipping_class_id = 163;
    $free = array();
    $over_found = $has_free = false;

    // Check if "Oversize" shipping class (163) is in cart items
    foreach(WC()->cart->get_cart() as $key => $cart_item){
        if($cart_item['data']->get_shipping_class_id() == $shipping_class_id ){
            $over_found = true;
            break;
        }
    }

    // 1. Hiding free shipping but always show Local pickup for Canada
    if( $over_found ){
        foreach($free_shipping_rates as $rate_id) {
            unset( $rates[$rate_id] );
        }
    }
    // 2. Hiding Flat rate OR Free shipping --> depending on cart amount
    //   (but always show Local pickup for Canada)
    else {
        foreach ( $rates as $rate_id => $rate ) {

            // Hide all "Flat rates" when "Free Shipping" is available
            if ( 'free_shipping' === $rate->method_id ) {
                $free[ $rate_id ] = $rate;
                $has_free = true;
            } elseif ( 'local_pickup' === $rate->method_id ) {
                $free[ $rate_id ] = $rate;
            }
        }
        return $has_free ? $free : $rates;
    }
    return $rates;
}

Код входит в function.php файл вашей активной дочерней темы (или темы) или также в любом файле плагина.

Протестировано на WooCommerce 3 и работает.


Обновите кэш доставки (иногда требуется):
1) Сначала опустошите свою корзину.
2) Этот код уже сохранен на вашем function.php файл.
3) Зайдите в настройки зоны доставки и отключите один "фиксированный тариф" (например) и "сохранить". Затем снова включите эту "фиксированную ставку" и "сохранить". Вы закончили, и вы можете проверить это.

 2
Author: LoicTheAztec, 2017-11-19 23:30:46