Диагностика задачи: зачем менять цену при изменении количества в корзине
В стандартном WooCommerce цена товара фиксирована, а итоговая сумма меняется пропорционально количеству. Однако для многих магазинов важно реализовать динамическое изменение цены товара в зависимости от количества — например, скидка при покупке нескольких единиц, либо наоборот, увеличение цены при минимальных объемах из-за логистики. В этом материале разберём, как реализовать автоматическое изменение стоимости товара при изменении количества в корзине с помощью кода и проверенных хуков WooCommerce.
Пошаговое решение: динамическое изменение цены в корзине
1. Подключение фильтра для изменения цены в корзине
Для изменения цены товара в корзине используется фильтр woocommerce_before_calculate_totals. Он вызывается перед пересчётом итогов корзины и позволяет модифицировать цены товаров в ней.
2. Пример кода для изменения цены в зависимости от количества
add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_by_quantity', 20, 1);function custom_dynamic_price_by_quantity( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; // Обходим все товары в корзине foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) { $quantity = $cart_item['quantity']; $product = $cart_item['data']; $regular_price = $product->get_regular_price(); // Пример логики изменения цены: // Если количество от 3 до 5 - скидка 10% if ( $quantity >= 3 && $quantity <= 5 ) { $new_price = $regular_price * 0.9; } elseif ( $quantity > 5 ) { // Если больше 5 штук - скидка 20% $new_price = $regular_price * 0.8; } else { $new_price = $regular_price; // Без изменений } $product->set_price( $new_price ); }}Этот код динамически меняет цену каждого товара в корзине в зависимости от текущего количества.
3. Добавление уведомления о скидке в корзине
Пользователю важно видеть условия скидок. Для этого можно добавить текст в корзину с помощью хука woocommerce_before_cart:
add_action('woocommerce_before_cart', 'custom_notice_discount_info');function custom_notice_discount_info() { echo '<div class="woocommerce-message">Скидка 10% при покупке от 3 до 5 единиц, 20% при покупке более 5</div>';}Проверка результата после внедрения
Чтобы убедиться, что динамическое изменение цены работает:
- Добавьте в корзину товар в количестве 1 шт — цена должна быть стандартной.
- Измените количество на 3–5 — цена товара должна уменьшиться на 10%.
- Увеличьте количество больше 5 — цена должна уменьшиться на 20%.
- Проверьте, что итоговая сумма в корзине корректно пересчитывается.
- Убедитесь, что уведомление о скидках отображается над корзиной.
Для проверки можете использовать встроенный режим отладки WooCommerce (включается в настройках) или временно добавить error_log() вызовы внутри функции.
Частые ошибки и как исправить
- Цена не меняется: проверьте, что хук
woocommerce_before_calculate_totalsподключён с приоритетом не ниже 20, иначе другие плагины могут перезаписать цену. - Цена меняется и остается после оформления заказа: убедитесь, что вы меняете цену товара только в корзине, а не в базе данных. Используйте
$product->set_price()только в контексте корзины. - Конфликты с кэшированием: очистите кэш сайта и браузера, отключите плагины кэширования на время тестирования.
- Изменение цены не учитывается в мини-корзине: убедитесь, что мини-корзина обновляется через AJAX после изменения количества.
Практические советы по безопасности и производительности
- Не сохраняйте динамическую цену в мета данных товара — это может привести к рассинхронизации и ошибкам.
- Оптимизируйте код фильтра — избегайте тяжелых запросов и вычислений внутри цикла.
- Если нужна более сложная логика скидок, рассмотрите использование WooCommerce Dynamic Pricing плагинов, но помните о нагрузке.
- Проверяйте совместимость с другими плагинами, влияющими на цены и корзину.
Сравнение вариантов реализации динамических скидок
| Метод | Плюсы | Минусы |
|---|---|---|
| Код на хуках (пример выше) | Гибкость, нет дополнительных плагинов, полный контроль | Требуется навыки разработки, возможны ошибки при обновлениях |
| Плагины динамического ценообразования | Простота настройки, готовые правила, поддержка | Нагрузка на сайт, ограниченная кастомизация, стоимость |
| Изменение цены через пользовательские поля товара | Возможность задавать индивидуальные цены | Сложность интеграции с корзиной, может запутать пользователей |