WooCommerce: исключение вариантов товаров, не отображаемых в корзине

Проблема: почему некоторые варианты товаров остаются в корзине после их скрытия

В WooCommerce иногда возникает задача исключить из корзины определённые варианты товаров, которые были скрыты или деактивированы, чтобы клиент не мог их заказать. Частая ситуация — в магазине есть товар с несколькими вариациями, некоторые из которых больше не доступны для продажи, но они по-прежнему могут оказаться в корзине из-за работы плагинов кеширования, автозаполнения или пользовательских сценариев.

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

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

Пошаговое решение: исключение скрытых вариаций из корзины

Чтобы гарантированно убрать из корзины скрытые вариации, можно воспользоваться хуком woocommerce_check_cart_items. Этот хук позволяет проверять содержимое корзины перед оформлением заказа и удалять нежелательные позиции.

Пример кода для functions.php темы или собственного плагина:

add_action('woocommerce_check_cart_items', 'exclude_hidden_variations_from_cart');
function exclude_hidden_variations_from_cart() {
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        if ($product->is_type('variation')) {
            $parent_id = $product->get_parent_id();
            $variation_id = $product->get_id();
            // Проверяем, опубликована ли вариация
            $status = get_post_status($variation_id);
            if ($status !== 'publish') {
                WC()->cart->remove_cart_item($cart_item_key);
                wc_add_notice(__('Одна из вариаций была удалена из корзины, так как недоступна для заказа.'), 'notice');
            }
        }
    }
}

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

Расширение: исключение по кастомному метаполю вариации

Если нужно исключать варианты по определённому пользовательскому признаку, например, по метаполю _hide_from_cart, добавьте проверку:

add_action('woocommerce_check_cart_items', 'exclude_variations_by_meta_from_cart');
function exclude_variations_by_meta_from_cart() {
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        if ($product->is_type('variation')) {
            $variation_id = $product->get_id();
            $hide = get_post_meta($variation_id, '_hide_from_cart', true);
            if ($hide) {
                WC()->cart->remove_cart_item($cart_item_key);
                wc_add_notice(__('Один из вариантов был удален из корзины по причине недоступности.'), 'notice');
            }
        }
    }
}

Как проверить, что решение работает

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

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

  • Неправильный статус вариации: иногда статус вариации не меняется на private или draft, а скрывается только программно — в таком случае код на статус не сработает. Используйте метаполя или дополнительные проверки.
  • Кеширование корзины: если корзина кешируется, пользователь будет видеть устаревшие данные. Настройте исключения кеширования для страниц корзины и оформления заказа.
  • Удаление позиции после подсчёта стоимости: удаление товаров в хуке woocommerce_check_cart_items происходит до расчёта итогов. Если использовать поздние хуки, корзина может некорректно пересчитываться.
  • Конфликты с плагинами: некоторые плагины управления корзиной могут перезаписывать логику удаления, проверьте совместимость.

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

  • Не используйте дорогостоящие запросы в циклах по корзине, кешируйте результаты, если нужно.
  • Используйте встроенные методы WooCommerce для работы с корзиной (WC()->cart), чтобы избежать непредвиденных ошибок.
  • Регулярно обновляйте WooCommerce и тему, чтобы использовать актуальные хуки и методы.
  • Для массового скрытия вариаций лучше использовать массовое изменение статуса в админке или через WP CLI.

Сравнение подходов: удаление вариаций из корзины

МетодПлюсыМинусы
Удаление по статусу публикации (код)Просто и быстро, не требует плагиновНе всегда отражает бизнес-логику скрытия вариаций
Удаление по метаполю (код)Гибко, можно настроить под любые критерииНужно вручную устанавливать метаполя, требует поддержки
Плагины управления корзинойМного готовых функций, удобство настройкиНагрузка на сайт, возможны конфликты, платные решения
Как отключить дубли архивов, тегов и авторов в WordPress без поломки индексации
19.08.2026
Как закрыть тонкие страницы поисковых фильтров в WordPress без потери полезной индексации
22.08.2026

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