Условно скрывать методы доставки WooCommerce на основе класса доставки
Использование WooCommerce v3.2.4 на Этом сайте (здесь) (WP v4.9) и 11 товаров с классом доставки избыточного веса/негабарита, к которым применяется фиксированная ставка:
$20 в Канаду и $25 в США.
Все остальные продукты имеют фиксированную стоимость доставки $10 ( Канада) и $15 ( США), если только заказ не закончен $100, затем бесплатная доставка применяется автоматически.
Мой клиент хочет, чтобы бесплатная доставка была отключена если в корзине есть какие-либо товары с избыточным весом/негабаритные товары. Проблема в том, что в корзине указано, что нет доступных способов доставки, когда в корзине есть смесь обычных и негабаритных товаров, и методы доставки не применяются.
Я использую Плагин Xadapter Woocommerce Shipping Table Rate, чтобы применить более высокую стоимость к классам доставки с "избыточным весом".
ОБНОВЛЕНИЕ
Я деактивировал этот плагин, так как понял, что могу просто использовать WooCommerce Настройки зоны доставки для установки фиксированной ставки для определенных классов доставки. Смотрите скриншот ниже:
Я использую некоторый код для:
- скрыть бесплатную доставку и фиксированные тарифы, если в корзине есть класс доставки "С избыточным весом"
- скрыть способ доставки "С избыточным весом", если этот класс не существует (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
1 answers
ОБНОВЛЕНИЕ 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) Зайдите в настройки зоны доставки и отключите один "фиксированный тариф" (например) и "сохранить". Затем снова включите эту "фиксированную ставку" и "сохранить". Вы закончили, и вы можете проверить это.