Как исключить товары и варианты 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Удаляет запрещённые товары из корзины перед оформлениемГарантирует отсутствие запрещённых товаров в заказеПользователь может видеть удаление товара в последний момент
Плагин для управления условиями корзиныИспользование готовых решений для сложных условийБольше гибкости без программированияМожет замедлить сайт, зависит от разработчика
Как удалить зависшие AJAX-запросы в WordPress
15.04.2026
Руководство по созданию и использованию REST API в WordPress
23.11.2025
Как массово удалить неиспользуемые медиа файлы в WordPress
09.12.2025
Как удалить зависшие варианты товаров WooCommerce по атрибуту
30.04.2026
Как удалить неиспользуемые таксономии и термины в WordPress
02.01.2026