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

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

Часто в WooCommerce возникает необходимость программно изменить количество товара в корзине. Например, ограничить максимальное количество товара, увеличить количество при добавлении по акции или синхронизировать количество с внешними данными. Однако простая смена $_POST или $_REQUEST не работает, так как WooCommerce использует сессии и перезаписывает данные при обновлении страницы.

Если вы пытаетесь изменить количество товаров в корзине через JavaScript или через фильтры, но при обновлении страницы видите старое значение — скорее всего, не срабатывает правильное обновление данных в объекте корзины WC_Cart.

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

1. Использование хука woocommerce_before_calculate_totals

Это один из надежных способов изменения количества товара перед расчетом итогов корзины.

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;

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        // Условие, по которому меняем количество, например, по ID товара
        if ( $cart_item['product_id'] === 123 ) { // замените 123 на ID вашего товара
            $new_quantity = 3; // нужное количество
            $cart->set_quantity( $cart_item_key, $new_quantity );
        }
    }
}

Этот код гарантирует, что перед расчетом общих сумм корзины количество товара будет изменено.

2. Изменение количества при добавлении товара в корзину

Если нужно сразу изменить количество при добавлении товара, можно использовать фильтр woocommerce_add_to_cart_quantity:

add_filter('woocommerce_add_to_cart_quantity', 'custom_add_to_cart_quantity', 10, 2);
function custom_add_to_cart_quantity( $quantity, $product_id ) {
    if ( $product_id == 123 ) { // ваш ID товара
        $quantity = 2; // новое количество при добавлении
    }
    return $quantity;
}

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

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

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

  • Изменение количества вне хука woocommerce_before_calculate_totals — изменения не сохраняются, так как WC_Cart перезаписывает данные.
  • Использование глобальной переменной $woocommerce вместо WC()->cart — устаревший подход, может привести к ошибкам.
  • Не проверяется контекст (админка, AJAX) — изменение может сломать админские запросы или AJAX-обработку корзины.
  • Изменение количества напрямую в сессии — не рекомендуется, лучше использовать API WC_Cart.

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

  • Всегда проверяйте, что функция не вызывается в админке без AJAX — добавьте проверку if ( is_admin() && ! defined('DOING_AJAX') ) return;.
  • При работе с ID товаров используйте строгие сравнения и валидируйте входные данные.
  • Минимизируйте количество циклов по корзине — используйте условия для целевых товаров.
  • Чтобы избежать конфликтов с плагинами, тестируйте код на чистом WooCommerce без дополнений.

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

МетодПреимуществаНедостаткиКогда использовать
Хук woocommerce_before_calculate_totalsНадежное изменение перед расчетом, сохраняется после обновленияМожно влиять только на уже добавленные товарыКоррекция количества в корзине
Фильтр woocommerce_add_to_cart_quantityИзменяет количество при добавлении товараНе изменяет уже добавленные товарыУстановка начального количества при добавлении
JS изменение поля количестваБыстрый визуальный эффектНе надежно, не влияет на сессию WooCommerceТолько для фронтенд-интерфейса
WooCommerce: удаление пользовательских ролей и изменение прав доступа
10.05.2026
WooCommerce: как запретить покупку товара для неавторизованных пользователей
19.06.2026
Как отключить email-уведомления в WordPress без плагинов
06.03.2026
Как использовать WPRemark для автоматического комментирования в WordPress
10.01.2026
WooCommerce: как автоматически отменять заказ после оплаты через код
08.06.2026