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

Диагностика проблемы: купоны применяются ко всем товарам, включая запрещённые

В WooCommerce стандартные механизмы купонов позволяют исключать товары по категориям, тегам или ID, но не по произвольным метаданным товара. Если у вас есть товары с особыми характеристиками, например, с мета-полем _exclude_from_coupons равным yes, и вы хотите, чтобы купоны не применялись к ним, стандартных настроек WooCommerce недостаточно.

Без доработки купон будет снижать цену на все товары, включая нежелательные, что может привести к потерям или нарушению бизнес-логики.

Пошаговое решение: создание фильтра для исключения товаров по метаданным

Чтобы реализовать исключение, нужно использовать фильтр woocommerce_coupon_is_valid_for_product. Этот фильтр вызывается для каждого товара в корзине при проверке применимости купона.

Пример кода, который запрещает применение купона к товарам с мета-полем _exclude_from_coupons равным yes:

add_filter('woocommerce_coupon_is_valid_for_product', 'exclude_products_by_meta_from_coupon', 10, 4); 
function exclude_products_by_meta_from_coupon($valid, $product, $coupon, $values) {
    // Получаем ID товара
    $product_id = $product->get_id();
    // Проверяем мета-поле
    $exclude = get_post_meta($product_id, '_exclude_from_coupons', true);
    if ($exclude === 'yes') {
        return false; // Запретить применение купона к этому товару
    }
    return $valid; // Оставить как есть для остальных товаров
}

Этот код можно добавить в файл functions.php вашей дочерней темы или в плагин для кастомных функций.

Дополнительные настройки для комплексных условий

Если мета-поля имеют разные значения или структура сложнее, можно расширить проверку, например:

if (in_array($exclude, array('yes', 'true', '1'), true)) {
    return false;
}

Проверка результата после внедрения

  1. Добавьте мета-поле _exclude_from_coupons со значением yes у тестового товара (через админку или код).
  2. Создайте купон в WooCommerce и примените его на странице корзины.
  3. Добавьте в корзину товар с мета-полем и обычный товар без мета-поля.
  4. Убедитесь, что скидка по купону применяется только к обычному товару, а к товару с мета-полем скидка не применяется.

Если скидка применяется ко всем товарам, проверьте правильность добавления кода и наличие ошибок в логах PHP.

Частые ошибки и как их исправить

  • Купон применяется ко всем товарам, включая запрещённые:
    • Проверьте, что мета-поле действительно у товара и его значение совпадает с проверяемым в коде.
    • Убедитесь, что фильтр добавлен с правильным приоритетом и параметрами.
    • Не используйте кеширование корзины без сброса кеша после изменений кода.
  • Код вызывает ошибку PHP или не работает:
    • Проверьте синтаксис кода, используйте отладчик или WP_DEBUG.
    • Убедитесь, что используете объекты WooCommerce версии 3.x и выше (для $product->get_id()).
  • Скидка применяется с неправильным расчётом:
    • Проверьте, что другие фильтры не конфликтуют с вашим кодом.

Практические советы по безопасности и производительности

  • Используйте минимально необходимые запросы к базе — кэшируйте результаты, если мета-поля не меняются часто.
  • Добавляйте код в дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
  • Тестируйте на staging-сайте, чтобы избежать сбоев в работе магазина.
  • Регулярно проверяйте логи ошибок PHP и WooCommerce для своевременного выявления проблем.

Сравнение подходов: плагин vs кастомный код

МетодПреимуществаНедостатки
Плагин (например, Advanced Coupons)Удобный интерфейс, расширенный функционал, поддержкаЗависимость от стороннего кода, возможные конфликты, нагрузка
Кастомный код (фильтр WooCommerce)Максимальный контроль, минимальная нагрузка, точечное решениеТребует навыков разработки, нужно поддерживать самостоятельно
WooCommerce: как исключить определённые товары из автоматических скидок
30.05.2026
WooCommerce: как использовать хук before_add_to_cart для проверки и изменения товара перед добавлением в корзину
02.07.2026
Как использовать AJAX в WordPress для объявлений без перезагрузки страницы
03.02.2026
Как изменить вывод атрибутов в WordPress
18.11.2025
Как добавить вывод из внешнего API в WordPress с помощью AJAX
20.03.2026