В чем заключается задача: исключение товаров по атрибутам из корзины
В интернет-магазинах на WooCommerce часто возникает необходимость ограничить покупку определенных вариантов товаров по атрибутам, например, по цвету или размеру. Это может быть связано с временным отсутствием на складе, ограничениями по логистике или маркетинговыми правилами. В этой статье мы рассмотрим, как программно исключить из корзины товары с конкретными значениями атрибутов "цвет" и "размер".
Диагностика проблемы: как понять, что товары не должны попадать в корзину
Для начала нужно понять, какие именно товары и вариации должны быть исключены. В WooCommerce атрибуты товаров (цвет, размер и другие) могут быть глобальными (созданными в разделе "Атрибуты") или локальными, заданными для конкретного товара. Вариации хранятся как отдельные продукты с метаданными атрибутов.
Для проверки фактических атрибутов вариации можно вывести их программно:
function print_product_attributes( $cart_item ) {
$product = $cart_item['data'];
if ( $product->is_type('variation') ) {
$attributes = $product->get_attributes();
foreach ( $attributes as $attr_name => $value ) {
echo $attr_name . ': ' . $value . '<br>';
}
}
}Подключите такую функцию в хук woocommerce_before_cart, чтобы увидеть атрибуты товаров в корзине и понять, по каким именно значениям фильтровать.
Пошаговое решение: исключение товаров с нужными атрибутами из корзины
1. Определяем атрибуты и значения для исключения
Допустим, нужно исключить товары с цветом "красный" (pa_color) и размером "XL" (pa_size).
2. Создаем функцию для фильтрации корзины
Используем хук woocommerce_before_cart для проверки и удаления товаров:
add_action('woocommerce_before_cart', 'exclude_products_by_attributes_from_cart');
function exclude_products_by_attributes_from_cart() {
$cart = WC()->cart;
if ( ! $cart ) return;
// Значения для исключения
$exclude_colors = array('red'); // slug цвета
$exclude_sizes = array('xl'); // slug размера
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
if ( $product->is_type('variation') ) {
$color = $product->get_attribute('pa_color');
$size = $product->get_attribute('pa_size');
if ( in_array(strtolower($color), $exclude_colors) || in_array(strtolower($size), $exclude_sizes) ) {
$cart->remove_cart_item( $cart_item_key );
wc_add_notice(sprintf('Товар "%s" удален из корзины, так как недоступен в выбранном цвете или размере.', $product->get_name()), 'error');
}
}
}
}3. Добавляем уведомление для пользователя
В примере выше уведомление wc_add_notice информирует покупателя, почему товар был удален.
Проверка результата: как убедиться, что исключение работает
- Добавьте в магазин вариации с цветом "красный" и размером "XL", а также другие.
- Положите в корзину товары с разными вариантами.
- Перейдите в корзину — товары с запрещёнными атрибутами должны автоматически удалиться, а на странице будет показано уведомление.
- Проверьте, что другие товары остались без изменений.
Частые ошибки и как их исправить
- Неверное имя атрибута: В WooCommerce атрибуты в вариациях всегда хранятся с префиксом
pa_. Используйте точные слуги, например,pa_color, а не простоcolor. - Неправильное сравнение значений: Значения атрибутов бывают в нижнем регистре, поэтому лучше использовать
strtolower()для сравнения. - Удаление в неподходящем хуке: Для удаления товаров из корзины используйте хуки, которые вызываются до отображения корзины, например,
woocommerce_before_cart. Хукwoocommerce_cart_loaded_from_sessionтакже подходит для удаления при загрузке корзины. - Отсутствие уведомлений: Если не добавить
wc_add_notice, пользователь не поймет, почему товар исчез из корзины.
Практические советы по безопасности и производительности
- Оптимизируйте проверку атрибутов: Не делайте тяжелых запросов в базе, используйте методы объекта товара.
- Кэширование: Если атрибутов много и логика сложная, можно кэшировать результаты проверки для ускорения.
- Тестируйте на staging: Перед внедрением в продакшен обязательно проверьте работу на тестовом сайте, чтобы не потерять продажи.
- Логирование ошибок: Добавьте логирование удаления товаров для последующего анализа через
error_logили плагины для отладки.
Сравнение способов исключения товаров из корзины
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код в functions.php | Полный контроль, без сторонних плагинов, быстрый | Требует навыков PHP, риск ошибок при неправильном коде |
| Плагины фильтрации корзины | Простота использования, готовый функционал | Могут быть тяжелыми, не всегда гибкие под узкие задачи |
| Изменение шаблонов WooCommerce | Можно изменить вывод и логику отображения | Сложнее поддерживать, не всегда подходит для удаления товаров |