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

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

В 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Удаляет запрещённые товары из корзины перед оформлениемГарантирует отсутствие запрещённых товаров в заказеПользователь может видеть удаление товара в последний момент
Плагин для управления условиями корзиныИспользование готовых решений для сложных условийБольше гибкости без программированияМожет замедлить сайт, зависит от разработчика
Как использовать WooCommerce хуки для настройки процесса оформления заказа
22.04.2026
Как исключить варианты товаров WooCommerce по атрибуту
19.04.2026
Как удалить и избежать duplicate content в WordPress
02.01.2026
Автоматическое изменение стоимости товаров WooCommerce по условиям
03.07.2026
Как использовать хуки в WordPress для решения конкретных задач
09.01.2026