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

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

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

Типичные причины проблемы:

  • Неактивна опция управления запасами WooCommerce.
  • В корзине не проверяется наличие товара при обновлении.
  • Отсутствует кастомный код или плагин, который бы очищал корзину от отсутствующих товаров.

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

1. Включаем управление запасами в WooCommerce

Перейдите в WooCommerce > Настройки > Товары > Запасы и убедитесь, что опция Включить управление запасами активирована. Это позволяет WooCommerce отслеживать остатки и статус наличия товара.

2. Добавляем кастомный код для автоматического удаления

В файл functions.php вашей дочерней темы или в функциональный плагин добавьте следующий код. Он проверяет наличие каждого товара в корзине и удаляет, если остаток меньше или равен нулю.

add_action('woocommerce_before_calculate_totals', 'remove_out_of_stock_items_from_cart', 10, 1);
function remove_out_of_stock_items_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->managing_stock()) {
            continue; // Если управление запасами неактивно, пропускаем
        }
        if (!$product->is_in_stock() || $product->get_stock_quantity() <= 0) {
            $cart->remove_cart_item($cart_item_key);
            wc_add_notice(sprintf(__('Товар «%s» удалён из корзины, так как отсутствует на складе.', 'woocommerce'), $product->get_name()), 'error');
        }
    }
}

3. Обновляем корзину и информируем пользователя

Код выше автоматически удалит отсутствующие товары при каждом пересчёте корзины и покажет сообщение об удалении. Для принудительного обновления корзины после изменений добавьте JS-скрипт в шаблон корзины:

jQuery(document).ready(function($) {
    $('form.woocommerce-cart-form').on('change input', function() {
        $(document.body).trigger('update_checkout');
    });
});

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

  1. Добавьте в корзину товар с остатком больше нуля — он остаётся в корзине.
  2. Уменьшите запас товара до нуля или ниже через админку WooCommerce.
  3. Обновите страницу корзины — товар должен удалиться автоматически, а на экране появится уведомление.
  4. Попробуйте оформить заказ с отсутствующим товаром — система не позволит, если товар отсутствует.

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

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

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

  • Кэширование: если у вас большой магазин, используйте transient API для кэширования статусов товаров на короткое время, чтобы не нагружать базу данных.
  • Обработка AJAX: для более плавного UX реализуйте проверку и удаление товаров через AJAX, чтобы не требовать полной перезагрузки страницы.
  • Безопасность: используйте проверку nonce при реализации AJAX-запросов, чтобы избежать CSRF-атак.
  • Тестирование: проверяйте работу кода на разных версиях WooCommerce и PHP, чтобы избежать несовместимостей.

Сравнение вариантов решения

МетодПлюсыМинусыКому подходит
Кастомный код в functions.phpБесплатно, полный контроль, легко кастомизируетсяНужно базовое знание PHP, может конфликтовать с темойРазработчикам, желающим точечное решение
Плагины управления корзинойПростота установки, готовые функцииДополнительные нагрузки, ограниченная кастомизацияПользователям без навыков программирования
Модификация темы WooCommerceИнтеграция с дизайном и UXСложнее поддерживать, возможны конфликты при обновлении темыПри разработке собственной темы
Как удалить или отключить Gutenberg в WordPress
05.12.2025
Как изменить авторские права в футере WordPress без изменения темы
05.02.2026
Как создать динамические фильтры для таксономий в WordPress с примерами кода
27.03.2026
Автоматизация обработки возвратов и обменов в WooCommerce
18.05.2026
Как создать и использовать внутренний REST API в WordPress
18.01.2026