Диагностика проблемы: зачем исключать товары по атрибуту из корзины и оформления заказа
В WooCommerce иногда возникает задача запретить покупку определённых товаров или их вариантов с конкретным атрибутом. Например, товары с атрибутом "Под заказ" нельзя продавать напрямую через корзину — их нужно исключить из оформления заказа, чтобы избежать ошибок или недоразумений.
Типичные случаи:
- Товары с отметкой "Под заказ" или "Только в магазине" не должны попадать в онлайн-заказ.
- Ограничение продажи товаров с определённым цветом/размером.
- Исключение товаров с определённым производителем или серией.
Как проверить, что в WooCommerce товары имеют нужный атрибут
Перед автоматизацией убедитесь, что товар или вариация действительно имеют нужный атрибут. Для этого:
- В админке перейдите в Товары → Все товары.
- Откройте нужный товар и проверьте вкладку Атрибуты.
- Если это вариативный товар, проверьте атрибуты конкретных вариантов в разделе Вариации.
Пошаговое решение: исключение товаров и вариантов WooCommerce с атрибутом из корзины и оформления заказа
1. Фильтрация добавления товара в корзину
Для предотвращения добавления товара с заданным атрибутом используйте фильтр woocommerce_add_to_cart_validation. В примере ниже мы блокируем товары с атрибутом pa_status и значением pod-zakaz (slug атрибута и значения должны быть в нижнем регистре и без пробелов):
add_filter('woocommerce_add_to_cart_validation', 'wpreg_exclude_products_by_attribute', 10, 3);
function wpreg_exclude_products_by_attribute($passed, $product_id, $quantity) {
$taxonomy = 'pa_status';
$excluded_value = 'pod-zakaz';
if (has_term($excluded_value, $taxonomy, $product_id)) {
wc_add_notice(__('Товар с атрибутом "Под заказ" нельзя добавить в корзину.'), 'error');
return false;
}
return $passed;
}2. Исключение вариаций с атрибутом из корзины
Если у вас вариативный товар, проверять нужно вариацию, а не родительский товар. Для этого:
add_filter('woocommerce_add_to_cart_validation', 'wpreg_exclude_variations_by_attribute', 10, 3);
function wpreg_exclude_variations_by_attribute($passed, $product_id, $quantity) {
$taxonomy = 'pa_status';
$excluded_value = 'pod-zakaz';
$product = wc_get_product($product_id);
if ($product && $product->is_type('variation')) {
$variation_id = $product_id;
if (has_term($excluded_value, $taxonomy, $variation_id)) {
wc_add_notice(__('Вариация с атрибутом "Под заказ" недоступна для покупки.'), 'error');
return false;
}
}
return $passed;
}3. Исключение товаров с атрибутом из уже добавленной корзины
Если товар с нужным атрибутом каким-то образом уже оказался в корзине (например, добавлен до активации фильтра), нужно его удалить перед оформлением заказа. Для этого применим следующий код в хуке woocommerce_check_cart_items:
add_action('woocommerce_check_cart_items', 'wpreg_remove_excluded_products_from_cart');
function wpreg_remove_excluded_products_from_cart() {
$taxonomy = 'pa_status';
$excluded_value = 'pod-zakaz';
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product_id = $cart_item['product_id'];
$variation_id = isset($cart_item['variation_id']) ? $cart_item['variation_id'] : 0;
$check_id = $variation_id ? $variation_id : $product_id;
if (has_term($excluded_value, $taxonomy, $check_id)) {
WC()->cart->remove_cart_item($cart_item_key);
wc_add_notice(__('Товар с атрибутом "Под заказ" был удалён из корзины.'), 'error');
}
}
}Проверка результата после внедрения
- Попытайтесь добавить в корзину товар с атрибутом
pa_status=pod-zakaz. Должно появиться сообщение об ошибке, и товар не должен добавляться. - Если товар с таким атрибутом уже в корзине, зайдите в корзину и убедитесь, что он удалён с уведомлением.
- Попробуйте оформить заказ — товары с таким атрибутом не должны проходить дальше.
Частые ошибки и как их исправить
- Неправильный slug атрибута или значения: В WooCommerce системные имена атрибутов начинаются с
pa_. Проверьте в Товары → Атрибуты, что slug совпадает с используемым в коде. - Проверка родительского товара вместо вариации: Для вариативных товаров используйте ID вариации (
variation_id), а не родительского товара. - Кеширование: Если сайт использует кеш, сообщения об ошибках могут не отображаться. Очистите кеш и отключите кеширование для проверки.
- Конфликты с плагинами: Некоторые плагины управления корзиной могут блокировать или изменять стандартные хуки WooCommerce. Временно деактивируйте плагины для теста.
Практические советы по безопасности и производительности
- Добавляйте код в дочернюю тему или через плагин для снижения риска потери изменений при обновлении.
- Не используйте тяжелые запросы или циклы — проверка атрибутов по
has_termоптимальна для WooCommerce. - Сообщения об ошибках выводите через
wc_add_notice, чтобы пользователи видели причины блокировок. - Регулярно проверяйте корректность slug атрибутов после импорта товаров или обновления WooCommerce.
Сравнение вариантов реализации
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Код на фильтре woocommerce_add_to_cart_validation | Блокировка добавления товаров и вариаций с атрибутом | Легко реализовать, работает на этапе добавления | Не удаляет уже добавленные товары |
Удаление товаров из корзины в woocommerce_check_cart_items | Удаляет запрещённые товары из корзины перед оформлением | Гарантирует отсутствие запрещённых товаров в заказе | Пользователь может видеть удаление товара в последний момент |
| Плагин для управления условиями корзины | Использование готовых решений для сложных условий | Больше гибкости без программирования | Может замедлить сайт, зависит от разработчика |