Диагностика проблемы с неактивными вариантами в корзине 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, нужно обновлять вручную |