Диагностика проблемы: почему не меняется количество товаров в корзине через код
Часто в 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 | Только для фронтенд-интерфейса |