WooCommerce: как изменить количество товаров в корзине через хук

Диагностика проблемы с изменением количества товаров в корзине WooCommerce

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

Чтобы понять, как изменить количество товара через хук, нужно знать, что WooCommerce использует объект WC_Cart, который хранит данные корзины, а изменение количества происходит через метод set_quantity().

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

1. Выбор правильного хука для изменения количества

Для контроля количества в корзине идеально подходит хук woocommerce_before_calculate_totals. Он срабатывает перед пересчётом итоговой стоимости корзины, что позволяет изменить количество товара.

2. Пример кода для изменения количества товара в корзине

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

    // Пример: для товара с ID 123 устанавливаем количество 2
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( $cart_item['product_id'] == 123 ) {
            $new_quantity = 2;
            $cart->set_quantity( $cart_item_key, $new_quantity, true );
        }
    }
}

Важно: третий параметр set_quantity отвечает за то, обновлять ли корзину после изменения (true — обновлять).

3. Как добавить ограничение максимального количества товара

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

    $max_quantity = 5; // Максимально допустимое количество

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( $cart_item['product_id'] == 123 && $cart_item['quantity'] > $max_quantity ) {
            $cart->set_quantity( $cart_item_key, $max_quantity, true );
        }
    }
}

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

  • Добавьте товар с ID 123 в корзину с количеством больше 2 (или больше максимального ограничения).
  • Обновите корзину — количество должно измениться автоматически согласно коду.
  • Проверьте, что итоговая сумма пересчитана корректно.
  • Отладьте, если изменения не применились, убедитесь, что хук действительно срабатывает (например, через error_log()).

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

  • Изменения не применяются: Проверьте, что код не запускается в админке (исключите это условием is_admin() && ! defined('DOING_AJAX')).
  • Корзина не обновляется: Убедитесь, что третий параметр set_quantity установлен в true, чтобы обновить сессию.
  • Конфликты с другими плагинами: Другие плагины могут влиять на корзину. Попробуйте отключить их для теста.
  • Неверный ID товара: Убедитесь, что product_id совпадает с нужным товаром.

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

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

Сравнение способов изменения количества товара в корзине WooCommerce

МетодОписаниеПлюсыМинусы
JavaScript (frontend)Изменение количества через интерфейс пользователя с помощью JSПростота реализацииНет серверной проверки, может быть легко обойдён
Хук woocommerce_before_calculate_totalsИзменение количества на сервере перед вычислением итоговПолный контроль, серверная валидацияНужно аккуратно избежать конфликтов с админкой и AJAX
Переопределение шаблонов корзиныИзменение логики отображения и обработки количества в шаблонахГибкость в интерфейсеСложность поддержки, возможны конфликты при обновлениях
Как создать свой плагин в WordPress с нуля
20.11.2025
Как создать динамические карты сайта в WordPress с помощью плагинов и кода
14.03.2026
WooCommerce: автоматическое отключение неиспользуемых вариантов товаров
28.07.2026
Как создать автоматическую сборку и оптимизацию базы данных WordPress
17.03.2026
Автоматическое удаление старого кеша в WordPress: практическое руководство
18.12.2025