Автоматическое исключение товаров WooCommerce из корзины при нулевом запасе

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

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

Основные симптомы:

  • Товары с нулевым запасом отображаются в корзине и оформлении заказа.
  • При попытке оформить заказ появляется ошибка об отсутствии товара на складе.
  • Пользователь не получает уведомлений об удалении или замене товара.

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

Реализуем проверку содержимого корзины при каждом ее обновлении или загрузке страницы, чтобы удалить товары с запасом 0. Для этого используем хук woocommerce_check_cart_items, который срабатывает до отображения корзины и оформления заказа.

add_action('woocommerce_check_cart_items', 'wpreg_remove_out_of_stock_items_from_cart');
function wpreg_remove_out_of_stock_items_from_cart() {
    $cart = WC()->cart->get_cart();
    $removed_items = 0;
    foreach ($cart as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        if (!$product->is_in_stock()) {
            WC()->cart->remove_cart_item($cart_item_key);
            $removed_items++;
        }
    }
    if ($removed_items > 0) {
        wc_add_notice(sprintf('Из корзины автоматически удалено %d товаров, отсутствующих на складе.', $removed_items), 'notice');
    }
}

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

Как добавить код в тему или плагин

Рекомендуется вставить данный код в functions.php дочерней темы или создать небольшой плагин, чтобы не потерять изменения при обновлении.

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

  1. Добавьте товар с запасом 1 в корзину.
  2. Уменьшите запас товара до 0 в админке WooCommerce.
  3. Перейдите в корзину – товар должен автоматически удалиться, и появится уведомление об удалении.
  4. Попробуйте оформить заказ – товар с нулевым запасом не должен присутствовать.

Для дополнительной проверки проверьте логи WooCommerce и убедитесь, что ошибок при оформлении заказа из-за отсутствия товара нет.

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

  • Товары не удаляются из корзины: убедитесь, что в WooCommerce активирован учет запасов (WooCommerce > Настройки > Товары > Управление запасами).
  • Удаление происходит, но уведомление не отображается: проверьте, что тема поддерживает вывод уведомлений wc_print_notices() в шаблонах корзины и оформления заказа.
  • Конфликты с другими плагинами, которые управляют корзиной: временно отключите такие плагины для теста и проверьте совместимость.

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

  • Не используйте тяжелые запросы к базе данных внутри цикла корзины — функция is_in_stock() уже оптимизирована.
  • Для магазинов с большим ассортиментом и большим трафиком рассмотрите использование кеширования объектов товара, чтобы снизить нагрузку.
  • Если требуется более тонкая фильтрация (например, исключать товары с определёнными атрибутами и нулевым запасом), расширяйте функцию условными операторами.

Альтернативные варианты реализации

МетодОписаниеПлюсыМинусы
Код в functions.phpДобавление кастомного кода в темуБыстро, гибкоЗависимость от темы, при смене темы код потеряется
Создание мини-плагинаВыделенный плагин для контроля корзиныНезависимость от темы, легко переноситьТребует базовых знаний плагиновой разработки
Плагины сторонних разработчиковГотовые решения для управления запасами в корзинеПростота установкиМожет нагружать сайт, не всегда соответствует требованиям
Оптимизация изображений в WordPress: улучшение скорости и SEO
02.12.2025
Оптимизация базы данных WordPress для ускорения сайта
03.11.2025
WooCommerce: установка ограничений на покупку товаров по атрибуту
15.07.2026
Как исключить варианты товаров WooCommerce по атрибуту
19.04.2026
Как избежать конфликтов между WooCommerce и кастомными плагинами
08.07.2026