Диагностика задачи: зачем менять цену товара по сумме корзины
В стандартном WooCommerce стоимость товара фиксирована и не зависит от содержимого корзины. Но в некоторых бизнес-моделях требуется реализовать динамическую ценообразовательную логику: например, скидка или наценка на товар при достижении определенной суммы в корзине. Это нельзя сделать средствами базового функционала, нужна кастомизация через хуки.
Как определить сумму корзины и изменить цену товара
Для изменения стоимости товара динамически используем хук woocommerce_before_calculate_totals. В этом хуке можно перебрать все товары корзины и изменить их цену в зависимости от общей суммы корзины.
Пример кода для изменения цены товара при сумме корзины больше 5000 рублей
add_action('woocommerce_before_calculate_totals', 'custom_change_price_based_on_cart_total', 10, 1);
function custom_change_price_based_on_cart_total($cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
// Получаем текущую сумму корзины без учета скидок
$cart_total = $cart->get_subtotal();
// Устанавливаем порог для изменения цены
$threshold = 5000;
// Проходим по всем товарам и меняем цену
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
$original_price = $product->get_regular_price();
if ($cart_total > $threshold) {
// Допустим, делаем скидку 10%
$new_price = $original_price * 0.9;
} else {
$new_price = $original_price; // обычная цена
}
$product->set_price($new_price);
}
}Пошаговое решение для внедрения
- Добавьте приведённый код в файл
functions.phpвашей дочерней темы или в кастомный плагин. - Очистите кеш сайта и браузера, если используется кеширование.
- Добавьте товары в корзину на сумму выше и ниже 5000 рублей, чтобы проверить работу изменения цены.
- Проверьте отображение цен на страницах корзины, оформления заказа и в email-уведомлениях.
Как проверить, что изменение цены работает
- Перейдите на страницу корзины с товарами на сумму ниже 5000 рублей — цены должны быть обычными.
- Добавьте товары, чтобы сумма корзины превысила 5000 рублей — цены должны автоматически измениться на 10% меньше.
- Обратите внимание, что цена меняется только для новых товаров в корзине. При необходимости можно добавить логику обновления при изменении количества.
- Проверьте, что итоговая сумма заказа соответствует новым ценам.
Частые ошибки и как их исправить
- Цена не меняется в корзине: проверьте, что хук подключён с правильным приоритетом и что код не блокируется условием
is_admin(). - Изменения цены не отражаются в заказах: убедитесь, что цена меняется именно в объекте продукта корзины, а не в базе данных.
- Конфликты с другими плагинами скидок: отключите другие плагины, которые модифицируют цены, чтобы проверить взаимодействие.
- Проблемы с кешированием: временно отключите кеширование страниц и WooCommerce transient cache.
Практические советы по безопасности и производительности
- Обрабатывайте только фронтенд-запросы, исключая админку и AJAX, чтобы не создавать лишнюю нагрузку.
- Избегайте вызова тяжелых функций внутри цикла по товарам корзины.
- Проверяйте, что цена не становится отрицательной или нулевой, чтобы избежать ошибок при оплате.
- Для больших магазинов с многочисленными товарами в корзине рассмотрите кэширование результатов вычислений, если логика усложняется.
Сравнение подходов: плагин vs код
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Точный контроль, отсутствие лишних плагинов, гибкость настройки | Требует навыков программирования, возможны баги при ошибках кода |
| Плагины динамического ценообразования | Простота настройки, готовые функции, поддержка | Нагрузка на сайт, возможные конфликты, стоимость лицензий |