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

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

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

Диагностика: когда нужно вмешиваться в цену корзины

Если вы замечаете, что стандартные скидки не подходят, или нужно учитывать бизнес-логику, завязанную на количестве, например:

  • при покупке от 10 штук цена снижается на 10%;
  • при покупке менее 3 штук цена повышается на 5% (минимальная партия);
  • индивидуальная ставка для определенной роли пользователя или группы товаров.

— значит пора кастомизировать цену в корзине.

Пошаговое решение: пример кода для динамической цены

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

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_for_quantity', 10, 1);
function custom_dynamic_price_for_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'];
        $original_price = $product->get_regular_price();

        // Пример правил изменения цены
        if ( $quantity >= 10 ) {
            // Скидка 10%
            $new_price = $original_price * 0.9;
        } elseif ( $quantity < 3 ) {
            // Наценка 5%
            $new_price = $original_price * 1.05;
        } else {
            $new_price = $original_price;
        }

        // Установка новой цены
        $product->set_price( $new_price );
    }
}

Этот код проверяет количество каждого товара в корзине и меняет цену в зависимости от заданных условий.

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

  • Добавьте в корзину товар с количеством 1-2 — цена должна увеличиться на 5%.
  • Добавьте количество от 10 и больше — цена уменьшится на 10%.
  • Количество от 3 до 9 — цена останется без изменений.
  • Проверьте, что итоговая сумма в корзине корректно отражает новые цены.

Для проверки можно временно вывести цены в шаблоне корзины, например, через дебаг:

error_log('Product ID: ' . $product->get_id() . ' New Price: ' . $new_price);

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

  • Цена не меняется в корзине: возможно, вы не сбрасываете кеш продукта или неправильно используете хук. Убедитесь, что код запускается в woocommerce_before_calculate_totals и что вы меняете цену объекта товара в корзине, а не глобально.
  • Конфликты с плагинами скидок: некоторые плагины могут перезаписывать цены после вашего кода. Проверьте приоритет хука, попробуйте увеличить его (например, с 10 на 20).
  • Изменение цены влияет на все страницы: убедитесь, что вы меняете цену только для объектов корзины, а не в общем объекте WC_Product. Используйте именно $cart_item['data'].
  • Цены не обновляются при AJAX-изменении количества: проверьте, что ваша функция работает при AJAX-запросах и не блокируется условием is_admin().

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

  • Не меняйте цены глобально — всегда ограничивайтесь объектами в корзине.
  • Избегайте тяжелых запросов и дополнительных API-вызовов в хуках изменения цены.
  • Тестируйте на staging-сайте с разными комбинациями товаров и пользователей.
  • Для сложных правил рассмотрите использование плагинов типа Clearfy Pro для оптимизации и управления скидками.

Сравнение способов реализации динамической цены

МетодОписаниеПлюсыМинусы
Своя функция на хуке woocommerce_before_calculate_totalsПрямое изменение цены в корзине через PHPГибко, быстро, без сторонних плагиновТребует знаний PHP, возможны ошибки при неправильной реализации
Плагины для ценообразования (Dynamic Pricing)Готовые решения с интерфейсом для скидок и наценокПросты в использовании, поддержкаМогут влиять на производительность, не всегда подходят под уникальные кейсы
Использование фильтров WooCommerceФильтры для изменения цены на уровне отображенияНе меняет цену в базе, можно легко отменитьМожет не учитывать логику корзины и заказов
Автоматическое удаление IP из черного списка в WordPress по времени
27.12.2025
Как удалить или скрыть версию WordPress без плагинов
06.02.2026
Как удалить записи и метаданные в WordPress без плагинов
06.01.2026
Как сделать автоматическое удаление спама в комментариях WordPress
23.01.2026
Как отключить Emoji в WordPress для ускорения сайта
02.02.2026