Диагностика проблемы: зачем и когда нужно удалять товары из корзины по атрибутам
В интернет-магазинах на WooCommerce часто возникает задача автоматически очищать корзину от товаров с определёнными характеристиками. Например, товары с нулевым запасом, устаревшие модели, товары с запрещёнными атрибутами (цвет, размер) или товары, запрещённые к продаже из-за условий акции. Без такой автоматизации корзина может содержать недоступные или неподходящие позиции, что ухудшает пользовательский опыт и приводит к ошибкам при оформлении заказа.
Основные признаки, что нужна автоматизация удаления:
- Пользователи жалуются на невозможность оформить заказ из-за отсутствия товара.
- В корзине остаются товары, которые по бизнес-правилам не должны там находиться.
- Необходима очистка корзины от товаров по определённым атрибутам или условиям автоматически, без ручного вмешательства.
Пошаговое решение: код для автоматического удаления товаров по атрибутам
1. Определяем атрибуты и условия удаления
Для примера будем удалять из корзины товары с атрибутом цвета red и размером XL. При необходимости условия легко расширяются.
2. Добавляем код в functions.php темы или в кастомный плагин
add_action('woocommerce_before_calculate_totals', 'remove_products_by_attributes_from_cart', 10, 1);
function remove_products_by_attributes_from_cart( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // Исключаем админку
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
$attributes = $product->get_attributes();
$remove = false;
// Проверяем атрибут цвета
if ( isset( $attributes['pa_color'] ) ) {
$color_terms = wp_get_post_terms( $product->get_id(), 'pa_color', array( 'fields' => 'slugs' ) );
if ( in_array( 'red', $color_terms ) ) {
$remove = true;
}
}
// Проверяем атрибут размера
if ( isset( $attributes['pa_size'] ) ) {
$size_terms = wp_get_post_terms( $product->get_id(), 'pa_size', array( 'fields' => 'slugs' ) );
if ( in_array( 'xl', $size_terms ) ) {
$remove = true;
}
}
if ( $remove ) {
$cart->remove_cart_item( $cart_item_key );
}
}
}3. Объяснение кода
- Хук
woocommerce_before_calculate_totalsзапускается перед подсчётом стоимости корзины. - Перебираются все товары в корзине.
- Получаем стандартные атрибуты продукта (например, «pa_color», «pa_size»).
- Проверяем, есть ли среди них запрещённые значения.
- Если условие срабатывает — товар удаляется из корзины.
Проверка результата после внедрения
Чтобы убедиться, что код работает корректно:
- Добавьте в корзину товары с атрибутом
redцвета или размеромXL. - Перейдите на страницу корзины или обновите её.
- Товары с указанными атрибутами должны автоматически исчезнуть из корзины без ошибок.
- Остальные товары остаются без изменений.
Если код работает через AJAX (например, в теме с динамической корзиной), убедитесь, что корзина обновляется после удаления.
Частые ошибки и как их исправить
- Атрибуты не совпадают по имени: проверьте, что в коде указаны правильные таксономии атрибутов (
pa_color,pa_size). Названия берутся из настроек товаров и в базе должны начинаться сpa_. - Товары вариационные: иногда атрибуты хранятся у вариаций, а не у основного продукта. Тогда нужно проверять
$cart_item['variation_id']и получать атрибуты вариации. - Кеширование или конфликт плагинов: если корзина не обновляется, попробуйте отключить кеширование страниц и конфликтующие плагины, которые могут блокировать AJAX-обновление.
- Удаление в админке: в коде мы исключаем админку, чтобы случайно не удалить товары при редактировании заказов.
Практические советы по безопасности и производительности
- Не используйте хук с слишком высокой приоритетностью, чтобы не замедлять загрузку страниц.
- Проверяйте наличие атрибутов перед вызовом функций, чтобы не вызывать лишних ошибок.
- Если атрибутов много или логика сложная — вынесите условия в отдельную функцию для удобства поддержки.
- Для больших магазинов с сотнями товаров в корзине стоит добавить кеширование или оптимизировать логику для снижения нагрузки.
Таблица сравнения вариантов реализации удаления товаров из корзины
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Код в functions.php (как в статье) | Гибко, бесплатно, легко адаптировать под любые условия | Требует навыков, поддержка на разработчике | Средние и крупные проекты с кастомной логикой |
| Плагины для управления корзиной (например, WooCommerce Conditional Shipping and Payments) | Интерфейс, легко настраивать без кода | Платные, ограничены функционалом плагина | Малые магазины, отсутствие разработчиков |
| Комбинированный подход (код + плагины) | Баланс гибкости и удобства | Сложнее в поддержке | Сложные бизнес-процессы, требующие автоматизации |