Диагностика проблемы: почему скидки применяются ко всем товарам
В стандартной настройке WooCommerce купоны, промокоды и скидки обычно применяются ко всем товарам в корзине. Это удобно, но часто требуется исключить из скидок определённые товары — например, премиум-продукты, товары с уникальными условиями или акционные позиции. Если скидка применяется ко всему, включая нежелательные товары, это снижает прибыль или ломает бизнес-логику.
Проверить текущие настройки можно в админке WooCommerce: Маркетинг > Купоны или в используемых плагинах скидок. Если нет явных исключений, значит, нужно реализовать фильтр вручную.
Пошаговое решение: исключаем товары из скидок через хук WooCommerce
1. Идентифицируем товары для исключения
Определим по ID, категории или атрибуту, какие товары не должны получать скидку. Например, товары с ID 15, 22 и 35. В реальном проекте можно использовать категории, например "premium".
2. Используем фильтр woocommerce_coupon_is_valid_for_product
Этот фильтр позволяет управлять применимостью купона к конкретному товару.
add_filter('woocommerce_coupon_is_valid_for_product', 'exclude_products_from_discount', 10, 4);
function exclude_products_from_discount($valid, $product, $coupon, $values) {
$excluded_ids = array(15, 22, 35); // ID товаров для исключения
if (in_array($product->get_id(), $excluded_ids)) {
return false; // Купон не применяется к этим товарам
}
return $valid;
}
3. Альтернатива: исключение по категории
add_filter('woocommerce_coupon_is_valid_for_product', 'exclude_category_from_discount', 10, 4);
function exclude_category_from_discount($valid, $product, $coupon, $values) {
$excluded_cat = 'premium';
if (has_term($excluded_cat, 'product_cat', $product->get_id())) {
return false;
}
return $valid;
}
Проверка результата после внедрения кода
- Добавьте в корзину товар из исключённого списка и любой другой товар.
- Примените купон или проверьте автоматическую скидку.
- Убедитесь, что скидка не применяется к товарам из исключённого списка, но применяется ко всем остальным.
- Для дополнительной проверки можно временно вывести логи или использовать плагин Debug Bar.
Частые ошибки и как их исправить
- Купон применяется ко всем товарам, включая исключённые: Проверьте, что функция возвращает
falseименно для нужных товаров и подключена с правильным приоритетом (10). Иногда другие плагины могут перебивать фильтр. - Фильтр не срабатывает для автоматических скидок: Фильтр
woocommerce_coupon_is_valid_for_productработает только для купонов, для других типов скидок нужен другой подход, например,woocommerce_cart_item_discount. - Ошибка в ID товаров или категории: Убедитесь, что ID и слаг категории указаны правильно, используйте функции
get_the_terms()илиhas_term()для проверки. - Кэширование мешает проверке скидок: Отключите кэширование страниц и кэш WooCommerce при тестировании, чтобы видеть актуальные результаты.
Практические советы по оптимизации и безопасности
- Храните список исключённых товаров в настройках темы или отдельной опции, чтобы не править код при изменениях.
- Для больших магазинов с тысячами товаров лучше исключать категории, а не ID, чтобы код оставался простым и быстрым.
- Тестируйте скидки на staging-сервере, чтобы избежать ошибок в рабочем магазине.
- Используйте логи WooCommerce или добавляйте временный вывод (
error_log()) для отладки фильтров.
Сравнение способов исключения товаров из скидок в WooCommerce
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| Исключение по ID товара | Просто и явно | Требует обновления кода при изменении товаров | В коде выше |
| Исключение по категории | Гибко, легко масштабируется | Нужно правильно структурировать категории | В коде выше |
| Плагины для управления скидками | Удобный UI, много вариантов | Дополнительная нагрузка и стоимость | Плагины, например WooCommerce Dynamic Pricing |