Я пытался создать вариант бесплатной доставки для рекламной продукции клиента, которая будет отправлена по всему миру, но будет иметь возможность бесплатной доставки только для заказов из Великобритании. Поэтому, когда кто-то заказывает из США или Гонконга, будет применяться обычный тариф. Но почему-то я не могу исключить эти страны из класса судоходства. (Я не использую метод бесплатной доставки, потому что, когда я пытаюсь, он применяется ко всем продуктам, поэтому я создал класс доставки для этого)
Может кто-то помочь мне с этим?
большое спасибо
Вам не нужно использовать методы доставки для вашего конкретного продукта для этого конкретного случая. Вместо этого, эта пользовательская функция, приведенная ниже, сделает свое дело, определив в ней ваш конкретный идентификатор продукта.
Когда клиент из Великобритании добавляет только Ваш конкретный продукт в корзину, код переименует ваш метод доставки по фиксированной ставке в «Бесплатная доставка», установив стоимость в НУЛЬ.
Чтобы проверить этот код, вы должны сначала включить режим отладки в настройках доставки Woocommerce на вкладке «Параметры доставки».
Кроме того, вам придется заново выполнить настройки для метода доставки с фиксированной ставкой или удалить класс доставки из вашего конкретного продукта.
Код:
add_filter( 'woocommerce_package_rates', 'disable_shipping_methods', 20, 2 );
function disable_shipping_methods( $rates, $package ) {
// ==> HERE set your targeted product IDs in a coma separated array
$products_ids = array(37);
if( ! ( isset($package['destination']['country']) && isset($package['contents']) ) )
return $rates; // If 'destination' country is not defined, we exit
// Only for United kingdom customers
if( $package['destination']['country'] != 'GB' )
return $rates; // Non UK customers we exit.
// Loop through cart items and checking if there is any other products than the targeted ones
$found = false;
foreach( $package['contents'] as $item ) {
if( in_array( $item['data']->get_id(), $products_ids ) ){
$found = true;
} else {
return $rates; // Other items found in cart, we exit.
}
}
// When the customer is in UK and the target product is alone in cart we set the flat rate price to zero.
foreach ( $rates as $rate_key => $rate ){
// Targetting flat rate method
if( $rate->method_id == 'flat_rate' && $found ){
// We change the shipping label name
$rates[$rate_key]->label = __("Free shipping", "woocommerce");
// Set the rate cost to zero
$rates[$rate_key]->cost = 0;
// Taxes rate cost (if enabled)
$taxes = array();
foreach ($rates[$rate_key]->taxes as $key => $tax){
if( $rates[$rate_key]->taxes[$key] > 0 ){
$taxes[$key] = 0;
$has_taxes = true;
}
}
if( isset($has_taxes) && $has_taxes )
$rates[$rate_key]->taxes = $taxes;
}
}
return $rates;
}
Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.
Форма клиента в Великобритании с этим уникальным товаром в корзине Бесплатная доставка
Форма покупателя в Великобритании с этим товаром и другими в корзине — Нормальная доставка
Клиент из других стран с этим уникальным товаром в корзине — Нормальная доставка
Как только вы это заработаете, не забудьте отключить режим отладки в настройках доставки Woocommerce на вкладке «Параметры доставки».
Извините за скриншот на немецком, но разве невозможно настроить зоны доставки & классы доставки?
Вы можете настроить 2 зоны доставки: Великобритания & остальной мир и добавьте классы доставки, как вы хотите для ваших продуктов. Если вы попробуете это, и оно все еще не работает, не могли бы вы приложить несколько примеров кода?