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

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

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

Чаще всего проблема проявляется при ручном изменении запасов или задержках в синхронизации с внешней системой учета. Чтобы улучшить UX и избежать ошибок, нужно автоматически очищать такие позиции из корзины.

Как проверить проблему

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

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

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

1. Добавление кода в functions.php темы или в кастомный плагин

add_action('woocommerce_before_cart', 'remove_out_of_stock_items_from_cart');
function remove_out_of_stock_items_from_cart() {
    if ( ! WC()->cart ) {
        return;
    }

    $cart = WC()->cart->get_cart();
    $removed = false;

    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 = true;
        }
    }

    if ( $removed ) {
        wc_add_notice( 'Некоторые товары были удалены из корзины, так как они отсутствуют на складе.', 'notice' );
    }
}

Этот код проверяет каждый товар в корзине и удаляет те, у которых метод is_in_stock() возвращает false. После удаления выводится уведомление пользователю.

2. Обработка AJAX-запросов и обновление страницы

Чтобы избежать багов с кэшированием или AJAX-обновлениями корзины, можно добавить подобную проверку и на AJAX-обновления:

add_action('woocommerce_cart_loaded_from_session', 'remove_out_of_stock_items_from_session');
function remove_out_of_stock_items_from_session() {
    if ( ! WC()->cart ) {
        return;
    }

    $cart = WC()->cart->get_cart();
    $removed = false;

    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 = true;
        }
    }

    if ( $removed ) {
        wc_add_notice( 'Некоторые товары были удалены из корзины, так как они отсутствуют на складе.', 'notice' );
    }
}

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

  • Добавьте в корзину товар с положительным запасом.
  • Измените запас товара на 0 или меньше в админке WooCommerce.
  • Обновите страницу корзины — товар должен автоматически удалиться, а на экране появится уведомление.
  • Проверьте оформление заказа: отсутствующие товары не должны быть доступны для оформления.

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

  • Товары не удаляются из корзины: Проверьте, что в вашем коде правильно вызываются методы WC()->cart->remove_cart_item() и что хук woocommerce_before_cart подключен.
  • Уведомления не отображаются: Убедитесь, что тема корректно выводит уведомления WooCommerce с помощью wc_print_notices().
  • Проблемы с кешированием: Если вы используете кеширование страниц, отключите его для страниц корзины и оформления заказа или настройте исключения.
  • Конфликты с другими плагинами: Отключите другие плагины, которые могут изменять поведение корзины, и проверьте работу кода вновь.

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

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

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

МетодПлюсыМинусыКомпромисс
Код на хуках WooCommerce Легко внедрить, без сторонних плагинов, контроль над логикой Требует базовых знаний PHP, возможны конфликты Добавить логирование для отладки и мониторинга
Использование плагинов управления запасами Удобный интерфейс, дополнительные функции учёта Зависимость от сторонних разработчиков, нагрузка Выбирать проверенные и оптимизированные решения
Ручная проверка и уведомления Простота, не требует кода Пользователь может забыть убрать товар, ошибки оформления Комбинировать с автоматизацией на уровне кода
Как автоматизировать удаление старых записей в WordPress через WP-Cron
06.04.2026
Как добавить уникальный фильтр на таксономии WordPress с примерами кода
03.03.2026
Регистрация пользователей по ролям в WordPress: практическое руководство
15.12.2025
WooCommerce: отключение автоматического обновления корзины при изменении вариантов товара
09.06.2026
Как создать многоуровневую пагинацию в WordPress с примерами кода
11.03.2026