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

Диагностика проблемы с неактивными вариантами в корзине WooCommerce

В интернет-магазинах на WooCommerce часто возникает ситуация, когда пользователь добавил в корзину вариацию товара, которая впоследствии стала неактивной (например, снята с продажи или отсутствует на складе). Это приводит к проблемам при оформлении заказа: покупатель видит некорректный товар, оформление заказа может завершиться ошибкой, а в админке возникают сложности с обработкой заказа.

Чтобы убедиться, что проблема именно в неактивных вариантах, проверьте корзину на наличие товаров, которые в админке товара помечены как «скрытые» или «отключенные» вариации, либо вариации с нулевым запасом (если включен контроль остатков).

Пошаговое решение: как автоматически удалять неактивные варианты из корзины

1. Использование хука WooCommerce для проверки и очистки корзины

Ниже представлен пример функции, которая при каждом расчете корзины проверяет все вариации товаров. Если вариация неактивна (статус "draft" или "private"), либо отсутствует в наличии, она автоматически удаляется из корзины.

add_action('woocommerce_check_cart_items', 'wplesson_remove_inactive_variations_from_cart');
function wplesson_remove_inactive_variations_from_cart() {
    if ( WC()->cart->is_empty() ) {
        return;
    }

    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        $product_id = $product->get_id();

        // Проверяем, является ли товар вариацией
        if ( $product->is_type('variation') ) {
            $parent_id = $product->get_parent_id();

            // Получаем статус вариации
            $post_status = get_post_status( $product_id );

            // Проверяем наличие и статус
            $stock_status = $product->is_in_stock();

            if ( $post_status !== 'publish' || ! $stock_status ) {
                // Удаляем из корзины
                WC()->cart->remove_cart_item( $cart_item_key );
                wc_add_notice( sprintf('Вариация товара "%s" была удалена из корзины, так как недоступна.', $product->get_name()), 'error' );
            }
        }
    }
}

2. Альтернативный вариант — проверка при добавлении товара в корзину

Чтобы предотвратить добавление неактивных вариаций в корзину, можно блокировать такую операцию с помощью фильтра woocommerce_add_to_cart_validation:

add_filter('woocommerce_add_to_cart_validation', 'wplesson_validate_variation_before_add', 10, 3);
function wplesson_validate_variation_before_add($passed, $product_id, $quantity) {
    $product = wc_get_product($product_id);

    if ( $product->is_type('variation') ) {
        $post_status = get_post_status( $product_id );
        $in_stock = $product->is_in_stock();

        if ( $post_status !== 'publish' || ! $in_stock ) {
            wc_add_notice('Выбранный вариант товара недоступен для покупки.', 'error');
            return false;
        }
    }

    return $passed;
}

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

  • Добавьте в корзину вариацию товара с публикацией "publish" — она добавится без проблем.
  • Попробуйте добавить вариацию, которая отключена или снята с публикации — добавление должно блокироваться.
  • Если в корзине уже есть неактивные вариации (тестируйте через админку, изменяя статус вариации), при обновлении корзины они автоматически удаляются, и выводится уведомление об удалении.

Для более глубокого тестирования можно включить режим отладки WooCommerce и проверить логи ошибок.

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

  • Ошибка: Не удаляются неактивные вариации из-за кэширования корзины.
    Решение: Очистите кэш сайта и браузера, отключите сторонние плагины кэширования на время теста.
  • Ошибка: Уведомления об удалении не отображаются.
    Решение: Проверьте, что вызов wc_add_notice() происходит до рендеринга страницы, и что тема корректно выводит уведомления WooCommerce.
  • Ошибка: Некорректная проверка статуса вариации (например, учитывается только "publish").
    Решение: Добавьте проверку на другие статусы, если используете кастомные типы публикаций или дополнительные статусы.

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

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

Сравнение подходов: удаление при проверке корзины vs блокировка добавления

Подход Плюсы Минусы Когда использовать
Удаление неактивных вариаций при проверке корзины Гарантирует чистоту корзины, даже если данные изменились после добавления товара Пользователь может увидеть удаление товара уже в корзине — неожиданный опыт Если товары часто меняют статус после добавления в корзину
Блокировка добавления неактивных вариаций Пользователь не сможет добавить недоступный товар, сразу понятно Не удаляет уже добавленные в корзину вариации Когда важно предотвратить ошибки при добавлении
Как удалить пустые meta данные в WordPress для ускорения сайта
23.03.2026
WooCommerce: как автоматически удалять неактивные варианты товаров из корзины
29.06.2026
Как избежать проблем с базой данных при миграции WordPress
22.01.2026
Как избежать проблем с конфликтами при использовании нескольких плагинов AJAX в WordPress
13.06.2026
Как создать автоматический отчет об ошибках в WordPress
29.03.2026