В чем суть задачи: зачем менять цену при изменении количества
Стандартный WooCommerce рассчитывает цену товара умножая стоимость за единицу на количество. Но иногда требуется динамическая корректировка цены — например, скидка за объем, наценка за малые партии, или индивидуальные условия для клиента. Реализовать это можно через хук woocommerce_before_calculate_totals, где можно программно менять цену в корзине.
Диагностика: когда нужно вмешиваться в цену корзины
Если вы замечаете, что стандартные скидки не подходят, или нужно учитывать бизнес-логику, завязанную на количестве, например:
- при покупке от 10 штук цена снижается на 10%;
- при покупке менее 3 штук цена повышается на 5% (минимальная партия);
- индивидуальная ставка для определенной роли пользователя или группы товаров.
— значит пора кастомизировать цену в корзине.
Пошаговое решение: пример кода для динамической цены
Добавьте следующий код в файл functions.php вашей темы или в отдельный кастомный плагин:
add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_for_quantity', 10, 1);
function custom_dynamic_price_for_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'];
$original_price = $product->get_regular_price();
// Пример правил изменения цены
if ( $quantity >= 10 ) {
// Скидка 10%
$new_price = $original_price * 0.9;
} elseif ( $quantity < 3 ) {
// Наценка 5%
$new_price = $original_price * 1.05;
} else {
$new_price = $original_price;
}
// Установка новой цены
$product->set_price( $new_price );
}
}Этот код проверяет количество каждого товара в корзине и меняет цену в зависимости от заданных условий.
Проверка результата после внедрения
- Добавьте в корзину товар с количеством 1-2 — цена должна увеличиться на 5%.
- Добавьте количество от 10 и больше — цена уменьшится на 10%.
- Количество от 3 до 9 — цена останется без изменений.
- Проверьте, что итоговая сумма в корзине корректно отражает новые цены.
Для проверки можно временно вывести цены в шаблоне корзины, например, через дебаг:
error_log('Product ID: ' . $product->get_id() . ' New Price: ' . $new_price);Частые ошибки и как их исправить
- Цена не меняется в корзине: возможно, вы не сбрасываете кеш продукта или неправильно используете хук. Убедитесь, что код запускается в
woocommerce_before_calculate_totalsи что вы меняете цену объекта товара в корзине, а не глобально. - Конфликты с плагинами скидок: некоторые плагины могут перезаписывать цены после вашего кода. Проверьте приоритет хука, попробуйте увеличить его (например, с 10 на 20).
- Изменение цены влияет на все страницы: убедитесь, что вы меняете цену только для объектов корзины, а не в общем объекте
WC_Product. Используйте именно$cart_item['data']. - Цены не обновляются при AJAX-изменении количества: проверьте, что ваша функция работает при AJAX-запросах и не блокируется условием
is_admin().
Практические советы по безопасности и производительности
- Не меняйте цены глобально — всегда ограничивайтесь объектами в корзине.
- Избегайте тяжелых запросов и дополнительных API-вызовов в хуках изменения цены.
- Тестируйте на staging-сайте с разными комбинациями товаров и пользователей.
- Для сложных правил рассмотрите использование плагинов типа Clearfy Pro для оптимизации и управления скидками.
Сравнение способов реализации динамической цены
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
Своя функция на хуке woocommerce_before_calculate_totals | Прямое изменение цены в корзине через PHP | Гибко, быстро, без сторонних плагинов | Требует знаний PHP, возможны ошибки при неправильной реализации |
| Плагины для ценообразования (Dynamic Pricing) | Готовые решения с интерфейсом для скидок и наценок | Просты в использовании, поддержка | Могут влиять на производительность, не всегда подходят под уникальные кейсы |
| Использование фильтров WooCommerce | Фильтры для изменения цены на уровне отображения | Не меняет цену в базе, можно легко отменить | Может не учитывать логику корзины и заказов |