Исключение товаров и вариантов WooCommerce по атрибуту из корзины и оформления заказа

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

В WooCommerce часто сталкиваются с задачей ограничить продажу определённых товаров или их вариантов по определённым атрибутам. Например, товары с атрибутом "Скидка не действует" или "Оплата при получении запрещена" должны быть видимы на сайте, но запрещены к покупке через корзину и оформление заказа.

Без правильной фильтрации WooCommerce допускает добавление таких товаров в корзину и оформление заказа, что может привести к ошибкам в процессе оплаты или логистики.

Как проверить наличие проблемы

  1. Добавьте в каталог товар с нужным атрибутом (например, цвет "Запрещённый").
  2. Попытайтесь добавить этот товар в корзину и перейти к оформлению заказа.
  3. Если товар успешно проходит до оформления заказа, значит фильтрация отсутствует.

Пошаговое решение: исключаем товары и варианты 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 проверяется весь состав корзины перед оформлением заказа и выводится ошибка, если запрещённые товары там есть.

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

  1. Добавьте в магазин товар с нужным атрибутом pa_zapreshennyj.
  2. Попытайтесь добавить этот товар в корзину — должна появиться ошибка, и товар не добавится.
  3. Если товар уже есть в корзине (например, до внедрения кода), при переходе к оформлению заказа должна выводиться ошибка, предупреждающая о необходимости удалить этот товар.
  4. Для полной автоматизации можно включить автоматическое удаление запрещённых товаров из корзины (раскомментировать соответствующий код в примере).

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

  • Неправильное имя атрибута: используйте именно 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 и безопасности
Платно
Может не покрывать конкретную логику исключения товаров
Оптимизация изображений в WordPress: улучшение скорости и SEO
02.12.2025
WooCommerce: установка ограничений на покупку товаров по атрибуту
15.07.2026
Как автоматически удалять зависшие transienty в WordPress
01.04.2026
Как отключить Gutenberg и вернуть классический редактор в WordPress
12.12.2025
Как удалить зависшие варианты товаров WooCommerce по атрибуту
30.04.2026