Диагностика проблемы: почему купоны применяются к нежелательным товарам
В стандартной функциональности WooCommerce купоны применяются ко всем товарам, если не задано специальных условий. Это вызывает проблемы, когда нужно запретить скидки на определённые категории, отдельные товары или товары с определёнными атрибутами. Например, товары с фиксированной ценой или товары по партнерским программам.
Чтобы убедиться, что ваша задача именно исключить товары из купонов, проверьте следующие моменты:
- В настройках купона не указан ограничительный фильтр по товарам или категориям.
- В корзине присутствуют товары, на которые скидка не должна распространяться.
- Скидка применяется ко всем товарам, включая те, которые должны быть исключены.
Пошаговое решение: исключение товаров из применения купонов через код
WooCommerce позволяет программно модифицировать применение купонов с помощью фильтра woocommerce_coupon_is_valid_for_product. Ниже пример, как исключить товары по ID из применения купонов.
1. Определяем ID товаров, которые нужно исключить
Вам нужно заранее знать ID товаров, которые нельзя скидать. Их можно получить в админке WooCommerce в списке товаров.
2. Добавляем код в functions.php вашей темы или в плагин-сниппет
add_filter('woocommerce_coupon_is_valid_for_product', 'exclude_products_from_coupons', 10, 4);
function exclude_products_from_coupons($valid, $product, $coupon, $values) {
// Список ID товаров для исключения
$excluded_product_ids = array(12, 34, 56);
if (in_array($product->get_id(), $excluded_product_ids)) {
return false; // купон не применяется к этому товару
}
return $valid;
}3. Проверяем работоспособность
Добавьте в корзину товар с ID из списка $excluded_product_ids и попробуйте применить купон. Скидка не должна применяться к этим товарам, а к остальным — работать как обычно.
Исключение товаров по категории или атрибутам
Если нужно исключить не отдельные товары, а целые категории или товары с определёнными атрибутами, используйте следующий подход.
add_filter('woocommerce_coupon_is_valid_for_product', 'exclude_category_products_from_coupons', 10, 4);
function exclude_category_products_from_coupons($valid, $product, $coupon, $values) {
$excluded_categories = array('exclusive', 'no-discount'); // ярлыки категорий
$product_cats = wp_get_post_terms($product->get_id(), 'product_cat', array('fields' => 'slugs'));
if (array_intersect($excluded_categories, $product_cats)) {
return false;
}
return $valid;
}Этот код проверит, есть ли у товара категория из списка исключений и запретит применение купона.
Проверка результата после внедрения
- Создайте тестовый купон без ограничений.
- Добавьте в корзину товары из исключённых категорий/ID и обычные товары.
- Попробуйте применить купон.
- Убедитесь, что скидка не применяется к товарам из исключённого списка, но применяется к остальным.
- Проверьте логику на страницах оплаты и в админке заказов.
Частые ошибки и как их исправить
- Купон всё равно применяется к исключённым товарам. Причина: код не добавлен в правильный файл или кеш не сброшен. Решение: очистите кеш сайта и браузера, убедитесь, что код активен.
- Использование неправильных ID или слагов. Проверьте правильность ID товаров и категорий, используйте
var_dumpдля отладки. - Конфликты с другими плагинами купонов. Проверьте, нет ли плагинов, которые переопределяют логику купонов, попробуйте временно отключить их.
- Код не учитывает вариации товаров. Для вариаций используйте
$product->get_parent_id()если нужно исключать по родительскому товару.
Практические советы по безопасности и производительности
- Не храните большие массивы ID в коде — лучше используйте категории или атрибуты для группового исключения.
- Добавляйте проверку только при необходимости — фильтр вызывается для каждого товара в корзине, поэтому сложные операции влияют на производительность.
- Используйте детальный лог ошибок (например, через
error_log) для отладки. - Для массовых изменений лучше создайте административный интерфейс или настройте через плагин, чтобы не править код.
Сравнение подходов: плагин vs код vs компромисс
| Метод | Плюсы | Минусы | Рекомендуется для |
|---|---|---|---|
| Использование плагина (например, Advanced Coupons) | Удобный интерфейс, гибкие настройки, поддержка | Дополнительная нагрузка, возможные конфликты | Пользователи без опыта программирования |
| Код в functions.php (как в статье) | Лёгкий, кастомный, без лишних плагинов | Требуется знание PHP, нет UI | Разработчики и опытные пользователи |
| Компромисс: готовые сниппеты + минимальный UI | Баланс удобства и контроля | Требует разработки, поддержка | Малые агентства и фрилансеры |