Включение бесплатной доставки в WooCommerce для определенных товаров
Я хотел бы узнать, возможно ли включить бесплатную доставку в WooCommerce только если определенные товары (или товары определенных категорий / классов доставки) находятся в корзине.
Опция бесплатной доставки активируется только на основе стоимости корзины или через промокод, поэтому я исследовал фиксированный тариф доставки и обнаружил, что он отдает приоритет самому дорогому классу доставки над более дешевыми. Это означает, что созданный мной класс бесплатной доставки никогда не переопределяет стандартную плату.
Я понимаю логику этого подхода, но это противоположно тому, что мне нужно, так как идея заключается в том, чтобы стимулировать покупки товаров с более высокой маржой прибыли путем исключения платы за доставку, когда они включены в заказ.
Я не знаю, возможно ли то, чего я пытаюсь достичь, в рамках WooCommerce. Купон, который применяется только к определенным товарам / категориям, кажется самым близким вариантом, но я бы предпочел не заставлять пользователей вводить код при оформлении заказа.
Кто-нибудь знает, есть ли более простые способы предоставить пользователям бесплатную доставку при покупке определенных товаров?

Кто-нибудь знает, есть ли более простые способы предоставить бесплатную доставку для пользователей, которые покупают определенные товары?
На самом деле, при создании товара вы можете просто отметить его как Виртуальный товар прямо в редакторе товара, и это полностью исключит доставку для данного товара.

Это работает для простых товаров, но не для других типов товаров — например, вариативных. Хорошая попытка, однако. Возможно, это сработает для некоторых людей.

Почему это не работает для вариативных товаров? Вы можете пометить каждую вариацию как virtual
.

Вот фрагмент, собранный из нескольких Gist в обсуждении на GitHub, на который ссылался @Ewout в другом ответе. Я добавил var_dump()
, так что вы можете раскомментировать и проверить, что именно хотите удалить.
$available_methods
— это array
вида:
$available_methods as $method_id => $method
Сравнивайте с $method_id
, если вам нужны более точные проверки.
// Скрываем стандартную доставку, если доступна бесплатная
add_filter( 'woocommerce_available_shipping_methods', 'wpse90835_hide_standard_shipping_when_free_is_available' );
/**
* Скрывает вариант стандартной доставки, если доступна бесплатная
*
* @param array $available_methods
*/
function wpse90835_hide_standard_shipping_when_free_is_available( $available_methods )
{
// Разработчики!: Используйте дамп для просмотра, что можно удалить
# var_dump( $available_methods );
// Удаляем стандартную доставку
if (
isset( $available_methods['free_shipping'] )
AND isset( $available_methods['flat_rate'] )
)
unset( $available_methods['flat_rate'] );
return $available_methods;
}

Я разработал плагин для WooCommerce, который позволяет пользователям настраивать расширенные параметры бесплатной доставки. В плагине можно выбрать определенные товары для бесплатной доставки.
Вы можете найти плагин бесплатно на wordpress.org под названием WooCommerce Advanced Free Shipping
Надеюсь, это поможет.

Возможно, это не полностью отвечает на ваш вопрос, но плагин расчета стоимости доставки по таблице дает возможность установить приоритет для конкретного тарифа. Кроме того, в этой дискуссии содержится много подсказок, где можно искать решения.

Спасибо. Изучив документацию по Table Rate Shipping, похоже, что этот инструмент действительно подходит для моих задач. Если мой работодатель одобрит лицензию, я сообщу, насколько он оказался полезен.

На основе кода kaiser (выше), я создал следующий код:
/**
* Скрывает бесплатную доставку, когда доступна стандартная доставка
*
* @param array $available_methods
*/
function mwe_hide_free_shipping_when_standard_shipping_is_available($available_methods) {
// удаляем вариант стандартной доставки
if (isset($available_methods['free_shipping']) AND isset( $available_methods['flat_rate'])) {
unset($available_methods['free_shipping']);
}
return $available_methods;
}
add_filter('woocommerce_available_shipping_methods', 'mwe_hide_free_shipping_when_standard_shipping_is_available');
Что касается настройки WooCommerce, у меня включены как бесплатная доставка, так и фиксированная ставка в настройках доставки WooCommerce. Затем я просто создал класс доставки, указал его стоимость (например, £7.95) в настройках фиксированной ставки и просто добавил этот класс доставки к товарам, для которых хочу установить стоимость доставки £7.95.

Опция "виртуальный" уберет все расходы на доставку, но также удалит возможность доставки по адресу, отличному от адреса оплаты клиента. Это не проблема, если клиент покупает другие, не виртуальные товары, но становится проблемой, если это единственный товар в заказе.
