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

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

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

  • Предоставление скидок за объем (bulk discounts) без использования сложных плагинов
  • Особые ценовые правила, зависящие от количества (например, фиксированная цена за 3 товара, другая — при 5+)
  • Изменение цены по формуле при изменении количества (например, цена за единицу снижается при покупке от 10 штук)

Эти задачи нельзя решить стандартным функционалом WooCommerce, поэтому необходима кастомизация.

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

Общая идея решения

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

Для этого реализуем фильтр woocommerce_before_calculate_totals, который позволяет модифицировать цены товаров в корзине перед подсчетом итогов.

Пошаговое решение с примером кода

1. Откройте файл functions.php вашей дочерней темы или используйте плагин для пользовательских функций.

2. Вставьте следующий код, который реализует простую логику скидки: если количество товара больше 5, цена уменьшается на 10%.

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

        if ( $quantity > 5 ) {
            // Скидка 10% при количестве больше 5
            $new_price = $original_price * 0.9;
        } else {
            $new_price = $original_price; // без изменений
        }

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

3. Сохраните изменения.

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

  • Добавьте товар в корзину в количестве меньше 5 — цена должна быть стандартной.
  • Измените количество товара в корзине на больше 5 — цена должна автоматически пересчитаться со скидкой 10%.
  • Обновите страницу корзины и убедитесь, что итоговая сумма отражает новые цены.

Частые ошибки при реализации динамического изменения цены

  • Цена не меняется в корзине: возможно, забыли добавить проверку is_admin() && ! defined( 'DOING_AJAX' ) для предотвращения конфликтов в админке.
  • Цена меняется, но итоговая сумма не обновляется: нужно использовать именно хук woocommerce_before_calculate_totals, а не woocommerce_cart_calculate_fees.
  • Цена сбрасывается при обновлении страницы: убедитесь, что не используете кэширование страниц в корзине/чекауте без исключений.
  • Изменение цены влияет на другие места сайта: изменение цены реализуется только для объекта товара в корзине, а не глобально.

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

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

Таблица сравнения вариантов реализации динамической цены в WooCommerce

МетодПреимуществаНедостатки
Фильтр woocommerce_before_calculate_totals (код)Точный контроль, бесплатно, легко кастомизируетсяТребуется программирование, риск ошибок при неправильном коде
Плагины для скидок и динамических цен (например, "Dynamic Pricing")Готовые настройки, поддержка, удобный интерфейсПлатные, могут влиять на производительность, ограниченная гибкость
Использование купонов и правил скидок WooCommerceВстроенный функционал, простотаОграниченная гибкость, нельзя менять цену товара, только итоговую скидку
Как автоматизировать назначение изображений в WordPress
19.12.2025
Как отключить автоматическое обновление плагинов WordPress
15.03.2026
Удаление неиспользуемых таксономий в WordPress: практическое руководство
09.02.2026
Автоматическое удаление старых черновиков в WordPress: практическое решение
02.02.2026
Как удалить версии постов в WordPress и оптимизировать базу данных
09.11.2025