Диагностика проблемы: купоны применяются ко всем товарам, включая запрещённые
В 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;
}
Проверка результата после внедрения
- Добавьте мета-поле
_exclude_from_couponsсо значениемyesу тестового товара (через админку или код). - Создайте купон в WooCommerce и примените его на странице корзины.
- Добавьте в корзину товар с мета-полем и обычный товар без мета-поля.
- Убедитесь, что скидка по купону применяется только к обычному товару, а к товару с мета-полем скидка не применяется.
Если скидка применяется ко всем товарам, проверьте правильность добавления кода и наличие ошибок в логах PHP.
Частые ошибки и как их исправить
- Купон применяется ко всем товарам, включая запрещённые:
- Проверьте, что мета-поле действительно у товара и его значение совпадает с проверяемым в коде.
- Убедитесь, что фильтр добавлен с правильным приоритетом и параметрами.
- Не используйте кеширование корзины без сброса кеша после изменений кода.
- Код вызывает ошибку PHP или не работает:
- Проверьте синтаксис кода, используйте отладчик или WP_DEBUG.
- Убедитесь, что используете объекты WooCommerce версии 3.x и выше (для
$product->get_id()).
- Скидка применяется с неправильным расчётом:
- Проверьте, что другие фильтры не конфликтуют с вашим кодом.
Практические советы по безопасности и производительности
- Используйте минимально необходимые запросы к базе — кэшируйте результаты, если мета-поля не меняются часто.
- Добавляйте код в дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
- Тестируйте на staging-сайте, чтобы избежать сбоев в работе магазина.
- Регулярно проверяйте логи ошибок PHP и WooCommerce для своевременного выявления проблем.
Сравнение подходов: плагин vs кастомный код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, Advanced Coupons) | Удобный интерфейс, расширенный функционал, поддержка | Зависимость от стороннего кода, возможные конфликты, нагрузка |
| Кастомный код (фильтр WooCommerce) | Максимальный контроль, минимальная нагрузка, точечное решение | Требует навыков разработки, нужно поддерживать самостоятельно |