WooCommerce: как исключить определённые товары из применения купонов

Диагностика проблемы: почему купоны применяются к нежелательным товарам

В стандартной функциональности 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Баланс удобства и контроляТребует разработки, поддержкаМалые агентства и фрилансеры
WooCommerce: как исключить определённые товары из применения купонов
23.06.2026
Как оптимизировать загрузку библиотеки jQuery в WordPress
31.12.2025
Как добавить удалённый вызов в WPBono Telegram Bot
12.01.2026
Как изменить вывод метаданных в WordPress без изменения темы
24.01.2026
WooCommerce: как исключить определённые товары из способов оплаты
26.04.2026