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

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

В WooCommerce при уменьшении количества товара в корзине до 0 можно ожидать, что товар автоматически удалится. Однако стандартного поведения на это нет: поле количества может быть равно 0, но товар останется в корзине, что сбивает с толку пользователей и ухудшает UX.

Причина в том, что WooCommerce не обрабатывает изменение количества 0 как команду на удаление товара. Поэтому требуется добавить кастомный код, который будет отслеживать изменение количества и при значении 0 удалять товар из корзины.

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

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

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

add_action('woocommerce_before_calculate_totals', 'remove_cart_item_if_quantity_zero', 10, 1);
function remove_cart_item_if_quantity_zero( $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 );
        }
    }
}

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

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

WooCommerce обновляет корзину через AJAX при изменении количества, поэтому нужно убедиться, что код работает корректно и на AJAX запросах. Хук woocommerce_before_calculate_totals вызывается при любой переработке корзины, в том числе и через AJAX, так что код выше подходит.

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

  1. Зайдите в корзину интернет-магазина на сайте.
  2. Измените количество любого товара на 0.
  3. Нажмите кнопку «Обновить корзину».
  4. Убедитесь, что товар исчез из корзины и общая сумма пересчиталась.

Для дополнительной проверки можно открыть консоль браузера (F12) и убедиться, что AJAX запросы обрабатываются без ошибок.

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

  • Код не срабатывает при AJAX обновлении корзины
    Проверьте, что функция подключена правильно и нет конфликтов с другими плагинами. Убедитесь, что хук woocommerce_before_calculate_totals не переопределяется.
  • Товар не удаляется сразу после установки 0, только при ручном обновлении страницы
    Возможно, тема или плагин кэшируют корзину. Отключите кэширование для страниц корзины и оформления заказа.
  • Ошибка PHP при вызове remove_cart_item
    Проверьте, что используете актуальную версию WooCommerce (рекомендуется 4.x и выше). Функция remove_cart_item должна быть доступна для объекта корзины.

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

  • Кэширование: Исключите страницы корзины и оформления заказа из кэширования (например, в плагинах типа WP Rocket, LiteSpeed Cache), чтобы изменения в корзине применялись мгновенно.
  • Минимизация нагрузки: Код работает на каждом пересчете корзины, но нагрузка минимальна, так как проверяется только количество товаров в текущей корзине пользователя.
  • Тестирование на продакшене: Всегда тестируйте изменения на staging-сайте перед применением на живом сайте, особенно если есть кастомные плагины, меняющие работу корзины.

Альтернативные варианты реализации: плагин vs код

Вариант Плюсы Минусы
Код (как выше) Быстро, бесплатно, без лишних плагинов, полное понимание работы Требует навыков программирования, возможны конфликты с темой/плагинами
Плагин (например, WooCommerce Cart Quantity Manager) Простой в установке, поддержка, дополнительные функции Зависимость от стороннего кода, возможная нагрузка, стоимость (если премиум)

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