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

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

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

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

  • При переходе в корзину и оформление заказа появляется ошибка «Такого варианта больше нет» или «Product variation is no longer available».
  • В админке WooCommerce в заказах видны товары с пометкой «нет в наличии» или «неактивный».
  • При вызове WC()->cart->get_cart() можно проверить наличие варианта и его статус.

Пошаговое решение: удаление неактивных вариантов из корзины с помощью хука

Реализуем автоматическую проверку позиций корзины по ходу загрузки страницы корзины или оформления заказа. Если вариант неактивен или был удален, удаляем его из корзины.

Шаг 1. Добавьте следующий код в functions.php вашей темы или в кастомный плагин:

add_action('woocommerce_before_calculate_totals', 'remove_inactive_variations_from_cart', 10, 1);
function remove_inactive_variations_from_cart($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        if ($product->is_type('variation')) {
            $variation_id = $product->get_id();
            $variation_post = get_post($variation_id);
            if (!$variation_post || $variation_post->post_status !== 'publish') {
                $cart->remove_cart_item($cart_item_key);
            }
        }
    }
}

Этот код перебирает все товары в корзине, проверяет статус варианта товара (должен быть publish) и удаляет позиции с неактивными вариантами.

Шаг 2. Тестирование и проверка

  • Добавьте в корзину несколько товаров с вариациями.
  • В админке отключите один из вариантов (измените статус на «черновик» или удалите).
  • Обновите страницу корзины — неактивный вариант должен автоматически исчезнуть из корзины.
  • Попробуйте оформить заказ — ошибки с отсутствующими вариантами не должны появляться.

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

Проверить, что код работает корректно, можно так:

  • В консоли браузера (если подключена отладка) ошибок при загрузке корзины не должно быть.
  • В базе данных в таблице wp_woocommerce_sessions корзина не содержит неактивных вариантов.
  • Проверьте через WC()->cart->get_cart() в дебаге, что в корзине нет неактивных товаров.

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

  • Не удаляются неактивные варианты: Проверьте, что хук woocommerce_before_calculate_totals срабатывает и что в корзине действительно есть вариации с post_status не publish.
  • Ошибка при удалении элемента корзины: Убедитесь, что используете $cart->remove_cart_item() корректно и не меняете массив корзины внутри foreach без ссылки.
  • Удаление активных товаров: Проверьте логику условия, возможно, неправильно определяете статус варианта.

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

  • Добавляйте проверку is_admin() && !defined('DOING_AJAX'), чтобы не выполнять лишние операции в админке.
  • Кэшируйте результаты функций, если корзина большая, чтобы не запускать лишние запросы к базе.
  • При большом количестве вариаций лучше проводить проверку через WP_Query, а не get_post() для оптимизации.
  • Используйте транзиенты для кеширования статусов, если проблема частая и нагрузка высокая.

Сравнение решений: плагин vs код

МетодПлюсыМинусы
Плагин (например, WooCommerce Cart Cleaner)Быстрая установка, готовое UI, поддержка обновленийМожет замедлять сайт, лишний функционал, риск конфликтов
Код в functions.php (как в статье)Легковесно, контролируемо, легко кастомизируетсяТребует навыков разработки, нет UI, нужно обновлять вручную
Как создать автоматический sitemap в WordPress с помощью кода и плагина
04.03.2026
WooCommerce: как автоматически удалять неактивные варианты товаров из корзины
26.06.2026
Использование WP-Cron для автоматического очищения кеша и базы данных в WordPress
12.05.2026
Как добавить несколько обложек для записи в WordPress
13.01.2026
Как автоматически добавлять атрибуты alt к изображениям в WordPress
15.03.2026