Диагностика проблемы: почему нужно удалять товары по атрибутам из корзины
В интернет-магазинах на WooCommerce часто возникает задача автоматически исключать из корзины товары с определёнными характеристиками (атрибутами). Это может быть связано с ограничениями по цвету, размеру, категории или другими параметрами, которые сложно контролировать вручную. Например, если товар с определённым атрибутом временно снят с продажи или не подлежит совместной продаже с другими товарами.
Без автоматизации пользователям приходится вручную удалять такие товары, что ухудшает UX и снижает конверсию.
Как проверить текущие товары в корзине и их атрибуты
Для начала нужно понять, как в WooCommerce получить доступ к товарам в корзине и их атрибутам.
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
$attributes = $product->get_attributes();
// Здесь можно проверить нужный атрибут
}Атрибуты возвращаются объектами WC_Product_Attribute или в виде массива. Для вариативных товаров атрибуты могут храниться в метаданных вариации.
Пошаговое решение: удаление товаров из корзины по заданным атрибутам
1. Определяем критерии фильтрации
Например, удаляем из корзины все товары с атрибутом "pa_color" равным "red".
2. Создаем функцию для удаления товаров по атрибутам
function wc_remove_products_by_attribute() {
$attribute_name = 'pa_color'; // имя атрибута
$attribute_value = 'red'; // значение атрибута
foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
// Для вариаций атрибуты хранятся в variation_attributes
$variation_attributes = isset($cart_item['variation']) ? $cart_item['variation'] : array();
// Проверяем наличие нужного атрибута в variation
if ( isset($variation_attributes[$attribute_name]) && $variation_attributes[$attribute_name] === $attribute_value ) {
WC()->cart->remove_cart_item($cart_item_key);
}
}
}
add_action('woocommerce_before_calculate_totals', 'wc_remove_products_by_attribute');3. Подключаем функцию в правильный хук
Лучше всего использовать woocommerce_before_calculate_totals, так как корзина уже загружена, но цены ещё не пересчитаны.
Проверка результата после внедрения
- Добавьте в корзину товар с атрибутом
pa_colorравнымred. После обновления страницы корзина должна очиститься от этих товаров. - Другие товары с другими атрибутами останутся в корзине.
- В админке WooCommerce в заказах такие товары не появятся, так как они не проходят в корзину.
Частые ошибки и как их исправлять
- Неверное имя атрибута: Убедитесь, что имя атрибута начинается с
pa_и совпадает с тем, что задано в WooCommerce (например,pa_size,pa_material). - Атрибуты не из вариаций: Если товар простой, атрибуты могут быть не в
variation. Для них используйте$product->get_attributes()и проверьте значения. - Хук срабатывает слишком рано или поздно: Используйте
woocommerce_before_calculate_totals, чтобы изменения корректно применялись до подсчёта стоимости. - Кэширование корзины: Если на сайте активно кеширование, убедитесь, что корзина не кешируется или обновляется корректно.
Практические советы по оптимизации и безопасности
- Не используйте тяжелые циклы с большим количеством вызовов в каждом запросе — ограничьте проверку одним вызовом за загрузку.
- Для разных атрибутов можно расширить функцию с параметрами, чтобы сделать её универсальной.
- Для повышения безопасности не меняйте корзину через GET-запросы, только в среде PHP и проверяйте nonce если используете AJAX.
Таблица сравнения вариантов решения
| Метод | Плюсы | Минусы |
|---|---|---|
Удаление через хук woocommerce_before_calculate_totals | Просто, быстро, без плагинов | Требуется знание кода, может сломать совместимость с другими плагинами |
| Использование плагина фильтрации корзины | Удобный интерфейс, расширенные настройки | Дополнительная нагрузка, не всегда гибко |
| AJAX-скрипты с проверкой на фронтенде | Мгновенный отклик, гибкость | Сложнее в реализации, требует безопасности |