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

В чем заключается задача и зачем менять стоимость товара динамически?

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

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

Диагностика задачи: как понять, что стандартных настроек WooCommerce недостаточно?

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

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

1. Использование фильтра woocommerce_before_calculate_totals

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

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

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;
    
    // Проходим по всем товарам в корзине
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $quantity = $cart_item['quantity'];
        $product = $cart_item['data'];
        $base_price = $product->get_regular_price();

        // Пример логики: если количество больше или равно 10, цена снижается на 10%
        if ( $quantity >= 10 ) {
            $new_price = $base_price * 0.9;
        } else {
            $new_price = $base_price;
        }

        // Устанавливаем новую цену
        $product->set_price( $new_price );
    }
}

3. Добавление условий и исключений

Можно дополнительно фильтровать товары по категориям, ID, мета-полям и прочему, чтобы изменять цену только для нужных позиций.

if ( has_term( 'optovye', 'product_cat', $product->get_id() ) ) {
    // применить динамическое ценообразование
}

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

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

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

  • Изменение цены не отображается: возможно, функция не подключена или неправильно приоритет хука. Убедитесь, что код добавлен в functions.php или в плагин с приоритетом не ниже 10.
  • Цена сбрасывается при обновлении страницы: убедитесь, что используется хук woocommerce_before_calculate_totals, а не woocommerce_cart_calculate_fees.
  • Неправильное обновление AJAX: в случае AJAX-обновления корзины добавьте проверку is_admin() && !defined('DOING_AJAX') чтобы избежать конфликтов.
  • Изменение цены влияет на другие страницы: динамическую цену нужно менять только в корзине и оформлении, не в каталоге и не в админке.

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

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

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

МетодОписаниеПлюсыМинусы
Плагин для оптовых скидок Готовое решение с настройками в админке Быстро, без кода, поддержка Весит, может быть избыточным, ограничена кастомизация
Ручной код в functions.php Своя логика через хуки, легкий и точечный Точная настройка, минимальный вес Требует навыков, возможны ошибки
Компромисс Использовать легкий плагин + кастомный код для специфики Баланс удобства и контроля Нужно тестировать совместимость
Оптимизация базы данных WordPress: удаление старых ревизий и автоматизация процесса
22.12.2025
Как использовать WP Actions для автоматизации обработки заказов WooCommerce
09.07.2026
Как вывести список авторских постов в WordPress с фильтрацией по автору и категории
11.04.2026
Как использовать WP хуки для автоматизации обработки заказов WooCommerce
03.06.2026
Как найти и удалить дубли страниц в WordPress без потери индексации
18.08.2026