WooCommerce: автоматическое изменение цены продукта при изменении количества в корзине

Диагностика задачи: зачем менять цену автоматически при изменении количества

В стандартном WooCommerce цена товара фиксирована и умножается на количество в корзине. Однако бывают ситуации, когда требуется динамически изменять стоимость единицы товара в зависимости от количества: например, применить скидку при покупке больших партий или увеличить цену для малых объемов. Это позволяет гибко управлять ценообразованием и стимулировать клиентов к покупке большего объема.

Как реализовать автоматическое изменение цены в корзине

Для решения задачи нужно перехватить момент обновления количества товара в корзине и динамически подкорректировать цену. Сделать это можно с помощью хука woocommerce_before_calculate_totals, который вызывается перед подсчетом итоговой стоимости корзины.

Пошаговое решение с примером кода

Добавьте следующий код в файл functions.php вашей темы или в собственный плагин:

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_based_on_quantity', 20, 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'];
        $product = $cart_item['data'];
        $base_price = $product->get_regular_price();

        // Пример логики: при покупке от 10 штук цена со скидкой 10%
        if ( $quantity >= 10 ) {
            $new_price = $base_price * 0.9; // скидка 10%
        } elseif ( $quantity >= 5 ) {
            $new_price = $base_price * 0.95; // скидка 5%
        } else {
            $new_price = $base_price; // базовая цена
        }

        $product->set_price( $new_price );
    }
}

В этом примере цена товара меняется в зависимости от количества: от 5 до 9 штук — скидка 5%, от 10 и больше — 10%. При меньших количествах цена не меняется.

Проверка результата после внедрения

  • Добавьте товар в корзину и измените количество: от 1 до 4 — цена не меняется, от 5 до 9 — цена должна стать на 5% ниже, от 10 и более — на 10% ниже.
  • Обновите корзину и убедитесь, что итоговая сумма пересчиталась корректно.
  • Проверьте на странице оформления заказа, что цены совпадают с расчетом в корзине.

Частые ошибки и как их исправить

  • Цена не меняется: Проверьте, что хук woocommerce_before_calculate_totals срабатывает, и код не находится в административной части без AJAX.
  • Цена сбрасывается при обновлении страницы: Убедитесь, что вы не используете функции, которые сбрасывают цену после подсчета, и что цена изменяется только в нужном хуке.
  • Конфликты с кешированием: При использовании плагинов кеша очистите кеш после внедрения изменений или отключите кеширование для страниц корзины и оформления заказа.
  • Неправильный расчет с вариативными товарами: Для вариативных товаров используйте $product->get_regular_price(), а не $product->get_price(), чтобы брать базовую цену вариации.

Практические советы для производительности и безопасности

  • Не меняйте цену товара глобально, изменяйте цену только в объекте товара в корзине — так не затронется основная цена продукта в каталоге.
  • Используйте кеширование результатов, если логика сложная и зависит от внешних данных.
  • Проверяйте, что пользователь не может обойти скидки или наценки через прямое изменение данных формы — все должно рассчитываться на сервере.
  • Тестируйте на разных устройствах и браузерах, так как корзина часто обновляется через AJAX.

Сравнение способов изменения цены в WooCommerce

МетодПлюсыМинусы
Использование woocommerce_before_calculate_totalsГибко, легко адаптировать, работает для всех товаровТребует программирования, возможны конфликты с другими плагинами
Плагины для динамического ценообразованияПростота настройки, готовый функционалМожет быть дорого, лишний код, ограниченная гибкость
Изменение цены через JavaScriptБыстрое визуальное изменениеНе безопасно, легко обходится, не меняет цену на сервере
⭐⭐⭐⭐⭐