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

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

В WooCommerce иногда возникает необходимость запретить покупку товаров с определёнными атрибутами, например, ограничить продажу товаров определённого цвета или размера. Это может быть связано с внутренним бизнес-процессом, поставками или акциями. В стандартном функционале WooCommerce нет прямого способа исключить товары из корзины по атрибутам, поэтому требуется вмешательство через код.

Определение атрибутов товаров в WooCommerce

Атрибуты в WooCommerce хранятся как таксономии. Например, атрибут "Цвет" с системным именем pa_color. Чтобы работать с ними в коде, нужно знать системные имена атрибутов и значения, которые присвоены товарам.

Как узнать системное имя атрибута

  • В админке WooCommerce перейдите в Товары > Атрибуты.
  • Обратите внимание на поле Системное имя — например, pa_color.

Как узнать значение атрибута товара

  • Откройте товар в редакторе.
  • В блоке «Атрибуты» проверьте выбранные значения.

Пошаговое решение: запрет добавления товаров с определёнными атрибутами в корзину

Реализуем проверку при добавлении товара в корзину через хук woocommerce_add_to_cart_validation. Если у товара есть запрещённый атрибут, запретим добавление и выведем сообщение об ошибке.

add_filter('woocommerce_add_to_cart_validation', 'exclude_products_by_attribute', 10, 3);
function exclude_products_by_attribute($passed, $product_id, $quantity) {
    // Системное имя атрибута
    $attribute_name = 'pa_color';
    // Значения атрибутов, которые запрещены к покупке
    $excluded_values = array('red', 'black');

    // Получаем термы атрибута для товара
    $terms = wp_get_post_terms($product_id, $attribute_name);

    if (!empty($terms) && !is_wp_error($terms)) {
        foreach ($terms as $term) {
            if (in_array($term->slug, $excluded_values)) {
                wc_add_notice(sprintf('Товар с атрибутом "%s" недоступен для покупки.', $term->name), 'error');
                return false;
            }
        }
    }
    return $passed;
}

В этом примере запрещены к покупке товары с цветом red и black.

Другие варианты условий

  • Можно расширить проверку по нескольким атрибутам, добавив дополнительные блоки с wp_get_post_terms.
  • Можно запретить добавление товара в корзину, если заданный атрибут присутствует в любой вариации товара.

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

  • Попробуйте добавить в корзину товар с запрещённым атрибутом — должно появиться сообщение об ошибке, товар не добавится.
  • Добавьте товар без запрещённых атрибутов — добавление должно пройти без ошибок.
  • Проверьте работу на разных типах товаров (простой, вариативный).

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

  • Не работает проверка для вариативных товаров
    Проверка идет на ID родительского товара, а атрибуты могут быть у вариации. Решение: использовать ID вариации из параметров хука и проверять атрибуты вариации.
  • Неверное системное имя атрибута
    Используйте именно системное имя с префиксом pa_, иначе wp_get_post_terms вернёт пустой массив.
  • Ошибка в написании значений атрибутов
    Проверяйте, что значения в массиве $excluded_values совпадают с слагами терминов, а не с названиями.
  • Сообщения об ошибках не отображаются
    Убедитесь, что тема поддерживает вывод wc_print_notices() или хуки WooCommerce для вывода уведомлений.

Практические советы по безопасности и производительности

  • Код лучше добавлять в дочернюю тему или собственный плагин, чтобы не потерять при обновлении.
  • Минимизируйте количество запросов к базе, кешируя результаты, если расширяете логику на много товаров.
  • Используйте проверку через AJAX для улучшения UX — сообщение об ошибке появляется сразу при попытке добавить товар.
  • Тестируйте на staging-сайте, чтобы избежать сбоев в рабочем магазине.

Сравнение вариантов реализации исключения товаров по атрибутам

МетодПреимуществаНедостатки
Код в functions.phpЛегко внедрить, гибко настраиваетсяРиск потери при смене темы, требует навыков PHP
Плагин для ограничения товаровИнтерфейс, готовые настройкиЧаще платные, могут конфликтовать
Изменение видимости товаровПростое решение без кодаТовары не видны вообще, не подходят для исключения только из корзины

Сервис определения шаблона и плагинов на сайте