Проблема: почему некоторые варианты товаров остаются в корзине после их скрытия
В 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.
Сравнение подходов: удаление вариаций из корзины
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление по статусу публикации (код) | Просто и быстро, не требует плагинов | Не всегда отражает бизнес-логику скрытия вариаций |
| Удаление по метаполю (код) | Гибко, можно настроить под любые критерии | Нужно вручную устанавливать метаполя, требует поддержки |
| Плагины управления корзиной | Много готовых функций, удобство настройки | Нагрузка на сайт, возможны конфликты, платные решения |