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

Проблема: стандартное поведение WooCommerce и необходимость динамического ценообразования

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

Реализовать такое поведение без доработок в WooCommerce невозможно, поэтому нужен программный подход для динамического изменения цены в корзине и на странице товара.

Диагностика задачи: что именно нужно изменить и где

Необходимо изменить итоговую стоимость товара в зависимости от количества еще на этапе добавления в корзину и пересчета цены в корзине и на странице оформления заказа. Важно, чтобы пользователь видел правильную цену сразу при выборе количества, а также чтобы итоговая цена учитывалась при оплате.

Также нужно убедиться, что изменения корректно сохраняются в заказах и не конфликтуют с другими плагинами скидок.

Пример решения: как автоматически изменять цену товара при изменении количества в WooCommerce

1. Изменение цены в корзине и заказе с помощью хука 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;
    // Чтобы не применять фильтр несколько раз
    if (did_action('woocommerce_before_calculate_totals') >= 2) 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;

        // Пример: скидка 5% при покупке от 10 штук
        if ($quantity >= 10) {
            $new_price = $original_price * 0.95;
        } elseif ($quantity >= 5) {
            // скидка 2% при покупке от 5 штук
            $new_price = $original_price * 0.98;
        }

        $cart_item['data']->set_price($new_price);
    }
}

2. Автоматическое обновление цены на странице товара с помощью JavaScript

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

add_action('wp_footer', 'custom_dynamic_price_js');
function custom_dynamic_price_js() {
    if (!is_product()) return;
    ?>
    <script>
    jQuery(document).ready(function($) {
        var basePrice = parseFloat($('.summary .price').first().text().replace(/[^0-9.,]/g, '').replace(',', '.'));
        $('form.cart').on('change input', 'input.qty', function() {
            var qty = parseInt($(this).val());
            if (isNaN(qty) || qty < 1) qty = 1;
            var newPrice = basePrice;
            if (qty >= 10) {
                newPrice = basePrice * 0.95;
            } else if (qty >= 5) {
                newPrice = basePrice * 0.98;
            }
            var totalPrice = (newPrice * qty).toFixed(2);
            $('.summary .price').text(totalPrice + ' ₽');
        });
    });
    </script>
    <?php
}

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

  • Добавьте товар на страницу магазина и измените количество, чтобы увидеть обновленную цену на странице товара (если подключили JS).
  • Добавьте товар в корзину с разным количеством и проверьте, что в корзине и на странице оформления заказа цена изменилась согласно заданным правилам.
  • Создайте заказ и проверьте, что цена сохранилась правильно в админке WooCommerce.

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

  • Цена не меняется в корзине: проверьте, что хук woocommerce_before_calculate_totals подключен корректно и что функция не прерывается преждевременно. Также убедитесь, что нет конфликтов с плагинами кеширования.
  • Цена на странице товара не обновляется: убедитесь, что jQuery подключен и скрипт вставлен на страницу товара. Проверьте селекторы в JS, так как структура темы может отличаться.
  • Изменение цены влияет на другие скидки или купоны: настройте приоритеты хуков и тестируйте совместимость с плагинами скидок.

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

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

Чек-лист для внедрения динамического изменения цены в WooCommerce

  1. Определить бизнес-логику для изменения цены в зависимости от количества.
  2. Добавить PHP-функцию с хуком woocommerce_before_calculate_totals для изменения цены в корзине.
  3. Реализовать динамическое обновление цены на странице товара через JS (по желанию).
  4. Проверить корректность отображения цены в корзине и оформлении заказа.
  5. Провести тесты с различными количествами и скидками.
  6. Проверить совместимость с другими плагинами скидок и кеширования.
  7. Следить за производительностью и безопасностью кода.

Сравнение вариантов реализации динамического ценообразования

МетодПлюсыМинусы
Хук PHP (woocommerce_before_calculate_totals)Надежно меняет цену в корзине и заказах; интегрируется с WooCommerceНе меняет цену на странице товара без доп. скриптов
JS на странице товараУлучшает UX, показывает цену сразуЗависит от структуры темы; не влияет на итоговую цену заказа
Плагины динамического ценообразованияГотовые решения с интерфейсом и настройкамиСтоимость, возможные конфликты, лишний функционал
WooCommerce: автоматическое изменение цены товара при изменении количества
01.07.2026
Как добавить автоматическое заполнение формы в WordPress
09.02.2026
WooCommerce: как автоматически отправлять кастомные сообщения при изменении статуса заказа
29.05.2026
Как автоматически изменять атрибуты варианта товара в WooCommerce при изменении запаса
22.05.2026
Как удалить черновики в WordPress без плагинов
22.01.2026