Диагностика задачи: зачем исключать товары из корзины по атрибутам
В 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 |
| Плагин для ограничения товаров | Интерфейс, готовые настройки | Чаще платные, могут конфликтовать |
| Изменение видимости товаров | Простое решение без кода | Товары не видны вообще, не подходят для исключения только из корзины |