Диагностика проблемы: зачем исключать товары по атрибутам из корзины и оформления заказа
В WooCommerce часто сталкиваются с задачей ограничить продажу определённых товаров или их вариантов по определённым атрибутам. Например, товары с атрибутом "Скидка не действует" или "Оплата при получении запрещена" должны быть видимы на сайте, но запрещены к покупке через корзину и оформление заказа.
Без правильной фильтрации WooCommerce допускает добавление таких товаров в корзину и оформление заказа, что может привести к ошибкам в процессе оплаты или логистики.
Как проверить наличие проблемы
- Добавьте в каталог товар с нужным атрибутом (например, цвет "Запрещённый").
- Попытайтесь добавить этот товар в корзину и перейти к оформлению заказа.
- Если товар успешно проходит до оформления заказа, значит фильтрация отсутствует.
Пошаговое решение: исключаем товары и варианты WooCommerce по атрибуту из корзины и оформления заказа
Для решения задачи используем два основных хука WooCommerce:
woocommerce_add_to_cart_validation— проверка при добавлении товара в корзину;woocommerce_check_cart_items— проверка всех товаров в корзине перед оформлением заказа.
Пример кода помещается в functions.php темы или в кастомный плагин:
add_filter('woocommerce_add_to_cart_validation', 'exclude_products_by_attribute_add_to_cart', 10, 3);
function exclude_products_by_attribute_add_to_cart($passed, $product_id, $quantity) {
$attribute_name = 'pa_zapreshennyj'; // имя атрибута (slug), например 'zapreshennyj'
$terms = wp_get_post_terms($product_id, $attribute_name);
if (!empty($terms)) {
$passed = false;
wc_add_notice('Товары с этим атрибутом нельзя добавлять в корзину.', 'error');
}
return $passed;
}
add_action('woocommerce_check_cart_items', 'exclude_products_by_attribute_in_cart');
function exclude_products_by_attribute_in_cart() {
$attribute_name = 'pa_zapreshennyj';
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
$product_id = $product->get_id();
$terms = wp_get_post_terms($product_id, $attribute_name);
if (!empty($terms)) {
wc_add_notice('В корзине есть товар с запрещённым атрибутом — удалите его для продолжения.', 'error');
// Дополнительно можно автоматически удалить товар из корзины:
// WC()->cart->remove_cart_item($cart_item_key);
}
}
}
Объяснение кода
- В функции
exclude_products_by_attribute_add_to_cartпроверяется, есть ли у товара атрибут с заданным slug, и если да — запрещается добавление с сообщением об ошибке. - В функции
exclude_products_by_attribute_in_cartпроверяется весь состав корзины перед оформлением заказа и выводится ошибка, если запрещённые товары там есть.
Проверка результата после внедрения
- Добавьте в магазин товар с нужным атрибутом
pa_zapreshennyj. - Попытайтесь добавить этот товар в корзину — должна появиться ошибка, и товар не добавится.
- Если товар уже есть в корзине (например, до внедрения кода), при переходе к оформлению заказа должна выводиться ошибка, предупреждающая о необходимости удалить этот товар.
- Для полной автоматизации можно включить автоматическое удаление запрещённых товаров из корзины (раскомментировать соответствующий код в примере).
Частые ошибки и как их исправить
- Неправильное имя атрибута: используйте именно slug атрибута с префиксом
pa_. Проверьте черезwp_get_post_terms()или в админке таксономий. - Проверка вариаций товара: если у вас вариационные товары, нужно проверять атрибуты вариаций, а не только родительский товар. Для этого используйте
$cart_item['variation_id']и аналогично получайте термины. - Сообщения не отображаются: убедитесь, что в шаблоне используются
wc_print_notices()или аналог для вывода уведомлений. - Кеширование: если на сайте есть кеш или CDN, очистите кеш после внесения изменений.
Практические советы по безопасности и производительности
- Не добавляйте сложные SQL-запросы внутри хуков добавления в корзину — используйте стандартные функции WordPress и WooCommerce.
- Для больших магазинов с сотнями товаров избегайте лишних запросов: кэшируйте результаты проверки атрибутов во время одного запроса.
- При использовании автоматического удаления товаров из корзины предупреждайте пользователя, чтобы избежать путаницы.
- Проверяйте совместимость с плагинами кэширования и оптимизации, чтобы уведомления wc_add_notice не блокировались.
Сравнение способов решения задачи
| Метод | Плюсы | Минусы |
|---|---|---|
| Код на хуках WooCommerce (как в статье) | Гибко, бесплатно, без сторонних плагинов Легко настраивается под любые атрибуты |
Требует базовых знаний PHP Не всегда очевидно для конечного пользователя |
| Плагины ограничения товаров (например, WooCommerce Conditional Shipping and Payments) | Готовое решение с UI Поддержка и обновления |
Платно Может быть избыточным для простой задачи |
| Использование правил в плагинах типа Clearfy Pro | Возможность комплексной оптимизации Дополнительные функции SEO и безопасности |
Платно Может не покрывать конкретную логику исключения товаров |