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

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

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

Частые признаки, что требуется автоматическое изменение стоимости товаров в корзине:

  • Цены не отражают скидки или наценки за объем
  • Пользователь сообщает, что цена не меняется при изменении количества
  • Нужно реализовать гибкую ценовую политику без использования сложных плагинов

Пошаговое решение: как реализовать изменение стоимости при изменении количества

1. Используем хук woocommerce_before_calculate_totals

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

2. Пример кода для изменения цены в зависимости от количества

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_change', 20, 1);
function custom_dynamic_price_change( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $quantity = $cart_item['quantity'];
        $original_price = $cart_item['data']->get_regular_price();

        // Пример логики: если количество больше 10, цена со скидкой 10%
        if ( $quantity > 10 ) {
            $new_price = $original_price * 0.9; // скидка 10%
        } elseif ( $quantity < 3 ) {
            $new_price = $original_price * 1.05; // наценка 5%
        } else {
            $new_price = $original_price; // стандартная цена
        }

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

3. Добавление уведомления о изменении цены (опционально)

Чтобы пользователь видел, что цена изменена, можно добавить кастомное сообщение в корзину:

add_action('woocommerce_before_cart_contents', 'show_dynamic_price_notice');
function show_dynamic_price_notice() {
    echo '<div class="woocommerce-info">Обратите внимание: цены в корзине изменяются в зависимости от количества товара.</div>';
}

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

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

Для отладки используйте инструменты разработчика браузера (консоль) и проверьте данные корзины в WooCommerce.

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

  • Цена не меняется: проверьте, подключен ли хук с правильным приоритетом и что код не находится в админке (исключение сделано в примере).
  • Цена меняется, но итоговая сумма некорректна: убедитесь, что цена меняется через $cart_item['data']->set_price(), а не напрямую в базе или другим способом.
  • Бесконечный цикл перерасчета: избегайте вызова функций, которые триггерят пересчет внутри хука woocommerce_before_calculate_totals.
  • Изменения цены затрагивают админку или страницы заказа: добавьте проверку is_admin() && ! defined('DOING_AJAX') для ограничения работы функции только на фронтенде.

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

  • Кэширование: не используйте сложные запросы или внешние API внутри хука для изменения цены — это замедлит загрузку корзины.
  • Безопасность: не меняйте цены товаров в базе данных, только в объекте корзины, чтобы не нарушать целостность данных.
  • Тестирование: после внедрения протестируйте разные сценарии изменения количества и оформления заказа, убедитесь, что цена сохраняется корректно на всех этапах.

Сравнение подходов: плагин vs кастомный код

МетодПреимуществаНедостаткиПример
Кастомный код (хук)Точная настройка, легкость поддержки, нет лишних зависимостейТребует навыков разработки, возможны ошибки при неправильном кодеПример кода выше в статье
Плагин (например, Dynamic Pricing)Готовое решение, удобный интерфейс, гибкие настройки без кодаМожет быть тяжелее, платные версии, ограничения в кастомизацииWooCommerce Dynamic Pricing
Автоматическое удаление неиспользуемых шорткодов в WordPress
01.03.2026
Как создать автоматический экспорт пользовательских данных в WordPress
06.04.2026
Как автоматически удалять неактивных пользователей WordPress с помощью cron задач
18.03.2026
WooCommerce: Автоматическое изменение стоимости товаров с точной границей и проверкой условий
18.05.2026
Как автоматически изменять метаданные для категорий в WordPress
02.04.2026