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

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

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

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

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

1. Используем JavaScript для динамического обновления цены на странице товара

На странице товара в WooCommerce поле выбора количества имеет класс qty. Мы можем отследить изменение этого поля и пересчитать цену с помощью JavaScript.

jQuery(document).ready(function($){
  var basePrice = parseFloat($('.single-product .summary .price .woocommerce-Price-amount').first().text().replace(/[^0-9\.]/g, ''));
  var priceElem = $('.single-product .summary .price .woocommerce-Price-amount').first();

  function updatePrice(){
    var qty = parseInt($('.qty').val());
    if(qty <= 0) qty = 1;
    var newPrice = basePrice;
    // Пример: скидка 10% при покупке от 10 шт
    if(qty >= 10){
      newPrice = basePrice * 0.9;
    }
    var totalPrice = (newPrice * qty).toFixed(2);
    priceElem.text(totalPrice + ' ₽');
  }

  $('.qty').on('change input', function(){
    updatePrice();
  });

  updatePrice();
});

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

2. Изменяем цену товара в корзине и заказе на сервере

Чтобы изменение цены действительно учитывалось в заказе, нужно использовать хук woocommerce_before_calculate_totals и корректировать цену товара в объекте корзины.

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 ) {
        $qty = $cart_item['quantity'];
        $product = $cart_item['data'];
        $base_price = $product->get_regular_price();

        $new_price = $base_price;
        // Пример: скидка 10% при покупке от 10 шт
        if ( $qty >= 10 ) {
            $new_price = $base_price * 0.9;
        }

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

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

Как проверить, что решение работает

  • Откройте страницу товара и измените количество. Цена на странице должна изменяться динамически.
  • Добавьте товар в корзину с разным количеством (например, 5 и 15 штук).
  • Перейдите в корзину, проверьте, что итоговая цена товара соответствует установленным правилам (скидка 10% при 10 и более штуках).
  • Оформите заказ и проверьте итоговую сумму в админке WooCommerce.

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

  • Цена меняется только на фронтенде, но не в корзине: значит не добавлен серверный хук woocommerce_before_calculate_totals. Проверьте, что код хука подключен в functions.php или плагине.
  • Цена меняется некорректно или не меняется при обновлении количества: убедитесь, что JavaScript корректно выбирает элементы и не конфликтует с другими скриптами или кешированием.
  • В админке заказов цена не совпадает с фронтендом: всегда рассчитывайте цену на сервере, только клиентская логика недостаточна.
  • Ошибки при расчетах с дробными числами: используйте number_format или toFixed() для форматирования цен и избегайте проблем с плавающей точкой.

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

  • Не изменяйте цену товара напрямую в базе, используйте только API WooCommerce (объекты WC_Product и хук woocommerce_before_calculate_totals), чтобы избежать конфликтов с другими плагинами и логикой.
  • Минимизируйте JavaScript на странице, чтобы не замедлять загрузку. Можно добавить код через enqueue и использовать локализацию скриптов для передачи базовой цены.
  • Тестируйте на совместимость с кеширующими плагинами и CDN — кеш может мешать динамическому изменению цены на клиенте.
  • Если у вас много товаров с такой логикой, рассмотрите реализацию через кастомные метаполя или отдельный плагин для управления скидками и наценками.

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

Способ Плюсы Минусы Применение
Только JavaScript на странице товара Быстро, просто для фронтенда Цена не меняется в корзине и заказе Только визуальное отображение цены
Хук woocommerce_before_calculate_totals Изменение цены в корзине и заказах, надежно Требует PHP навыков, сложнее Настоящее изменение цены для заказа
Использование плагинов скидок Готовое решение с интерфейсом Может быть избыточно, ограничена кастомизация Быстрое внедрение без кода
Как избежать конфликтов между плагинами WordPress
17.01.2026
Как добавить пользовательские роли и права в WordPress без плагинов
13.01.2026
Как отключить автоматические обновления в WordPress
13.04.2026
Как создать автоматический импорт данных из Google Sheets в WordPress
16.04.2026
Как удалить неиспользуемые поля в базе данных WordPress для оптимизации
18.02.2026