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

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

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

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

  • Товар с количеством 0 отображается в корзине.
  • При переходе к оформлению заказа появляется ошибка из-за некорректного количества.
  • Пользователю приходится вручную нажимать «Удалить» вместо автоматического удаления.

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

1. Добавление фильтра для обработки обновления корзины

Для решения задачи нужно перехватить обновление количества товара и при значении 0 удалять товар из корзины. Используем хук woocommerce_before_calculate_totals для перебора товаров и удаления тех, у которых количество 0.

add_action('woocommerce_before_calculate_totals', 'auto_remove_zero_quantity_items', 10, 1);
function auto_remove_zero_quantity_items( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    // Для каждой позиции в корзине
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( isset( $cart_item['quantity'] ) && $cart_item['quantity'] == 0 ) {
            $cart->remove_cart_item( $cart_item_key );
        }
    }
}

2. Обработка обновления корзины через AJAX

Если на сайте используется AJAX-обновление корзины (обычно это в шаблонах с кнопкой «Обновить корзину»), нужно убедиться, что изменение количества на 0 действительно вызывает удаление товара. В стандартном WooCommerce это работает, но при кастомных скриптах может понадобиться дополнительная обработка.

Если AJAX не обновляет корзину автоматически, добавьте следующий jQuery код в футер темы:

jQuery(function($) {
    $('form.woocommerce-cart-form').on('change', 'input.qty', function() {
        var qty = parseInt($(this).val());
        if (qty === 0) {
            // Триггерим обновление корзины, чтобы сработал PHP код удаления
            $('button[name="update_cart"]').trigger('click');
        }
    });
});

Как проверить, что решение работает

  1. Откройте страницу корзины WooCommerce.
  2. Установите количество любого товара в 0.
  3. Нажмите «Обновить корзину» (если кнопка есть) или дождитесь автоматического обновления.
  4. Товар должен исчезнуть из корзины сразу после обновления.
  5. Попробуйте оформить заказ — ошибки, связанные с товаром с количеством 0, не должны появляться.

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

  • Товар не удаляется при установке количества 0: убедитесь, что код добавлен в functions.php активной темы или в плагин. Проверьте, что нет конфликтов с другими плагинами, которые модифицируют корзину.
  • AJAX-обновление корзины не срабатывает: проверьте консоль браузера на наличие ошибок JavaScript. Возможно, кастомный скрипт блокирует стандартное обновление. Добавьте jQuery код для триггера обновления корзины при изменении количества.
  • После удаления товара корзина не обновляется визуально: убедитесь, что на странице правильно подключены скрипты WooCommerce и обновление корзины происходит корректно (например, вызов wc_cart_fragments).

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

  • Не используйте хук woocommerce_before_calculate_totals для выполнения тяжёлой логики — в нашем случае удаление товаров по количеству 0 не нагружает сервер.
  • Код не должен конфликтовать с кэшированием страниц. Если используется плагин кеширования, убедитесь, что AJAX запросы WooCommerce не кешируются.
  • Для безопасности не допускайте прямых изменений корзины вне проверок WooCommerce, чтобы не нарушить логику ценообразования и скидок.

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

МетодОписаниеПлюсыМинусы
PHP-код удаления на хукеУдаляет товар при количестве 0 на сервереНадёжно, работает на всех устройствахНужно обновлять корзину вручную или через JS
AJAX-скрипт обновления корзиныОбновляет корзину автоматически при вводе 0Улучшает UX, автоматическое удалениеЗависит от корректной работы JS и jQuery
Плагины для управления корзинойИспользование готовых решений с расширенными опциямиБыстрое внедрение, дополнительные функцииМожет быть избыточным и влиять на производительность

Скачать WP с оф. сайта Магазин проверенных платных тем