Диагностика проблемы: зачем исключать товары по атрибутам из корзины
В WooCommerce иногда возникает задача запретить покупателям добавлять в корзину товары с определёнными атрибутами. Например, исключить товары с определённым цветом, размером или характеристикой, чтобы избежать конфликтов, ограничений по доставке или другим бизнес-правилам.
Без правильной настройки клиент может добавить запрещённый товар в корзину, что приводит к ошибкам при оформлении заказа или путанице в логистике.
Пошаговое решение: как реализовать исключение товаров по атрибутам
1. Определение атрибута для исключения
Для начала определите slug атрибута, по которому хотите фильтровать товары. Например, атрибут pa_color со значением red.
2. Добавление фильтра в functions.php
Добавьте следующий код в файл functions.php вашей дочерней темы или в плагин для кастомного кода:
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'; // slug атрибута
$excluded_value = 'red'; // значение для исключения
$product = wc_get_product($product_id);
if (!$product) {
return $passed;
}
// Получаем массив значений атрибута
$attributes = $product->get_attributes();
if (isset($attributes[$attribute_name])) {
$attr = $attributes[$attribute_name];
// Проверяем, является ли атрибут таксономией
if ($attr->is_taxonomy()) {
$terms = wp_get_post_terms($product_id, $attribute_name, array('fields' => 'slugs'));
if (in_array($excluded_value, $terms)) {
wc_add_notice(__('Этот товар нельзя добавить в корзину из-за выбранного атрибута.', 'woocommerce'), 'error');
return false;
}
} else {
// Атрибут пользовательский
$values = explode('|', $attr->get_options());
if (in_array($excluded_value, $values)) {
wc_add_notice(__('Этот товар нельзя добавить в корзину из-за выбранного атрибута.', 'woocommerce'), 'error');
return false;
}
}
}
return $passed;
}3. Кеширование и производительность
Если на сайте много товаров и атрибутов, рассмотрите кеширование результатов или предварительную фильтрацию, чтобы не нагружать сервер при каждом добавлении товара в корзину.
Проверка результата после внедрения
- Попробуйте добавить товар с указанным атрибутом (например, цвет
red) в корзину — должно появиться сообщение об ошибке и товар не добавится. - Попробуйте добавить товар с другим значением атрибута — добавление должно пройти успешно.
- Проверьте работу на мобильных и десктопных устройствах.
- Протестируйте совместимость с кэш-плагинами и режимом AJAX добавления в корзину.
Частые ошибки и как их исправить
- Неправильный slug атрибута: используйте точный slug с префиксом
pa_для таксономий, например,pa_color, а не простоcolor. - Атрибут не является таксономией: проверьте, в каком формате хранится атрибут, и корректно обработайте пользовательские атрибуты.
- Кэширование мешает обновлениям: при использовании плагинов кеширования отключите их на страницах корзины и добавления товара.
- Отсутствие уведомления об ошибке: убедитесь, что вызов
wc_add_noticeкорректный и тема отображает сообщения WooCommerce.
Практические советы по безопасности и производительности
- Не изменяйте ядро WooCommerce — используйте хуки и фильтры.
- Размещайте кастомный код в дочерней теме или отдельном плагине, чтобы не потерять изменения при обновлениях.
- Для сайтов с высокой нагрузкой применяйте объектное кеширование и минимизируйте количество запросов к базе при проверке атрибутов.
- Отслеживайте логи ошибок PHP, чтобы вовремя заметить проблемы с проверкой атрибутов.
Сравнение подходов: плагин vs кастомный код
| Метод | Плюсы | Минусы |
|---|---|---|
| Готовый плагин (например, WooCommerce Conditional Shipping and Payments) | Быстрая установка, поддержка, интерфейс настройки | Платный, может быть избыточным для простой задачи, нагрузка на систему |
| Кастомный код в functions.php | Полный контроль, бесплатный, легкий | Требует навыков, нужно тестировать самостоятельно |