WooCommerce: Автоматическое удаление товаров из корзины по атрибутам и условиям

Диагностика проблемы: зачем и когда нужно удалять товары из корзины по атрибутам

В интернет-магазинах на 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»).
  • Проверяем, есть ли среди них запрещённые значения.
  • Если условие срабатывает — товар удаляется из корзины.

Проверка результата после внедрения

Чтобы убедиться, что код работает корректно:

  1. Добавьте в корзину товары с атрибутом red цвета или размером XL.
  2. Перейдите на страницу корзины или обновите её.
  3. Товары с указанными атрибутами должны автоматически исчезнуть из корзины без ошибок.
  4. Остальные товары остаются без изменений.

Если код работает через AJAX (например, в теме с динамической корзиной), убедитесь, что корзина обновляется после удаления.

Частые ошибки и как их исправить

  • Атрибуты не совпадают по имени: проверьте, что в коде указаны правильные таксономии атрибутов (pa_color, pa_size). Названия берутся из настроек товаров и в базе должны начинаться с pa_.
  • Товары вариационные: иногда атрибуты хранятся у вариаций, а не у основного продукта. Тогда нужно проверять $cart_item['variation_id'] и получать атрибуты вариации.
  • Кеширование или конфликт плагинов: если корзина не обновляется, попробуйте отключить кеширование страниц и конфликтующие плагины, которые могут блокировать AJAX-обновление.
  • Удаление в админке: в коде мы исключаем админку, чтобы случайно не удалить товары при редактировании заказов.

Практические советы по безопасности и производительности

  • Не используйте хук с слишком высокой приоритетностью, чтобы не замедлять загрузку страниц.
  • Проверяйте наличие атрибутов перед вызовом функций, чтобы не вызывать лишних ошибок.
  • Если атрибутов много или логика сложная — вынесите условия в отдельную функцию для удобства поддержки.
  • Для больших магазинов с сотнями товаров в корзине стоит добавить кеширование или оптимизировать логику для снижения нагрузки.

Таблица сравнения вариантов реализации удаления товаров из корзины

СпособПлюсыМинусыКогда использовать
Код в functions.php (как в статье)Гибко, бесплатно, легко адаптировать под любые условияТребует навыков, поддержка на разработчикеСредние и крупные проекты с кастомной логикой
Плагины для управления корзиной (например, WooCommerce Conditional Shipping and Payments)Интерфейс, легко настраивать без кодаПлатные, ограничены функционалом плагинаМалые магазины, отсутствие разработчиков
Комбинированный подход (код + плагины)Баланс гибкости и удобстваСложнее в поддержкеСложные бизнес-процессы, требующие автоматизации
Как отключить плагины на отдельных страницах WordPress для ускорения сайта
11.01.2026
Как изменить URL изображения в WordPress без плагинов
18.01.2026
Как автоматизировать управление публикациями в WordPress с помощью WP-Cron и кода
11.04.2026
Как удалить автоматически ожидающие регистрации пользователей в WordPress
24.03.2026
Как добавить автоматическое удаление неликвидных постов в WordPress
01.02.2026

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.