Диагностика задачи: зачем менять цену в зависимости от количества
В интернет-магазинах на WooCommerce часто возникает необходимость динамически менять цену товара в зависимости от количества, приобретаемого одним заказчиком. Это может быть полезно для внедрения скидок за объем, поощрения оптовых покупателей или управления акциями. Стандартные настройки WooCommerce этого не предусматривают, поэтому нужно реализовать кастомное решение.
Как изменить цену товара в зависимости от количества: обзор подходов
Есть несколько способов реализовать такую функциональность:
- Использование плагинов для скидок по количеству — быстрый, но не всегда гибкий способ.
- Добавление кастомного кода в functions.php темы или в плагин — более точечное и контролируемое решение.
Рассмотрим именно кастомный код, так как он позволяет максимально точно задать логику и избежать лишних зависимостей.
Пошаговое решение: пример кода для динамического изменения цены
Добавьте следующий код в functions.php вашей дочерней темы или в свой плагин:
add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_based_on_quantity', 10, 1);
function custom_dynamic_price_based_on_quantity($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
// Обход корзины
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$quantity = $cart_item['quantity'];
$original_price = $cart_item['data']->get_regular_price();
$new_price = $original_price;
// Пример логики изменения цены
if ($quantity >= 10 && $quantity < 20) {
// Скидка 10% при покупке от 10 до 19 штук
$new_price = $original_price * 0.9;
} elseif ($quantity >= 20) {
// Скидка 20% при покупке 20 штук и больше
$new_price = $original_price * 0.8;
}
// Устанавливаем новую цену товара в корзине
$cart_item['data']->set_price($new_price);
}
}Объяснение кода
- Хук
woocommerce_before_calculate_totalsсрабатывает до пересчёта итогов; - Обходим все товары в корзине;
- В зависимости от количества товара задаём новую цену со скидкой 10% или 20%;
- Используем
set_price()для корректного отображения цены; - Игнорируем админскую сторону и AJAX-запросы, чтобы избежать конфликтов.
Проверка результата после внедрения
Чтобы убедиться, что код работает корректно:
- Добавьте товар в корзину в количестве 1-9 штук — цена должна оставаться без изменений.
- Добавьте количество от 10 до 19 — цена должна уменьшиться на 10%.
- Добавьте 20 и более штук — цена снизится на 20%.
- Проверьте, что итоговая сумма в корзине и на странице оформления заказа соответствует новой цене.
- Проверьте отображение цены на фронтенде (корзина, мини-корзина, checkout).
Частые ошибки и как их исправить
- Цена не меняется: возможно, код не подключён или указан с ошибкой. Проверьте файл functions.php и активность дочерней темы.
- Цены меняются, но итоговая сумма не корректна: убедитесь, что хук
woocommerce_before_calculate_totalsиспользуется правильно и приоритет установлен 10. - Изменения влияют на админку или AJAX-запросы: добавьте проверку
if (is_admin() && !defined('DOING_AJAX')) return;в начале функции. - Конфликты с плагинами для скидок: отключите сторонние плагины и проверьте работу кода, затем подключайте по одному для выявления конфликтов.
Практические советы по производительности и безопасности
- Минимизируйте количество операций в цикле по корзине — тяжелые вычисления лучше делать вне цикла.
- Не сохраняйте цену напрямую в базу данных, используйте
set_price()для корректного обновления сессии и отображения. - Для более сложных правил рассмотрите использование transient API для кеширования расчетов.
- Проверяйте совместимость с WooCommerce и WordPress после обновлений.
Альтернативы: плагины vs код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагины (например, WooCommerce Dynamic Pricing) | Простота использования, готовые правила скидок, поддержка | Могут быть тяжелыми, платные, не всегда гибкие |
| Кастомный код (как в статье) | Полный контроль, легковесность, кастомизация под любые задачи | Требует навыков программирования, поддержка на себе |