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

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

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

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

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

Для решения задачи используем фильтр woocommerce_before_calculate_totals. Он позволяет модифицировать цену каждого товара в корзине перед расчётом итогов.

Пример кода для функции, которая уменьшает цену товара при покупке более 5 штук:

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'];
        $product = $cart_item['data'];

        $base_price = $product->get_regular_price();

        if ( $quantity >= 5 ) {
            $new_price = $base_price * 0.9; // Скидка 10% при 5 и более
        } else {
            $new_price = $base_price;
        }

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

Объяснение кода

  • Проверяем, что код не выполняется в админке, чтобы не влиять на административные операции.
  • Используем проверку, чтобы избежать повторного запуска фильтра.
  • В цикле проходим по всем товарам в корзине.
  • Берём количество товара и базовую цену (регулярную цену).
  • Если количество 5 и больше, уменьшаем цену на 10%.
  • Устанавливаем новую цену через set_price().

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

После добавления этого кода в файл functions.php или подключаемый плагин:

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

Для дополнительной проверки можно вывести цену товара прямо в корзине с помощью фильтра woocommerce_cart_item_price и вывести текущую цену для отладки.

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

  • Цена не меняется в корзине: возможно, фильтр woocommerce_before_calculate_totals не сработал — проверьте приоритет, попробуйте установить 20 или выше. Также проверьте, не перезаписывает ли цену другой плагин.
  • Цена меняется в админке или бэкенде: добавьте проверку is_admin() && ! defined( 'DOING_AJAX' ), чтобы избежать этого.
  • Цена сбрасывается после обновления страницы: убедитесь, что функция не вызывает циклические обновления, используйте did_action.
  • Проблемы с кешированием: если используется кеширование, отключите его для страниц корзины и оформления заказа.

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

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

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

МетодПлюсыМинусыПример
Код через woocommerce_before_calculate_totalsГибкость, контроль, бесплатноТребует навыков PHP, возможно конфликт с другими плагинамиПример выше
Плагины динамического ценообразования (например, WooCommerce Dynamic Pricing)Простота настройки, готовые правилаПлатные, могут влиять на производительностьНастройки в админке
Использование вариаций товараСтандартный функционал WooCommerceМенее удобно при больших изменениях ценыСоздание вариаций для разных цен
Как отключить AJAX пагинацию в WooCommerce
30.04.2026
Как изменить стоимость доставки в WooCommerce в зависимости от роли пользователя
07.05.2026
Как создать автоматические отзывы в WordPress с помощью плагина Expert Review
31.12.2025
WooCommerce: как изменить стоимость товара по дисконным кодам
16.06.2026
Как отключить автоматический редирект в WordPress
15.12.2025