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

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

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

Основная проблема в том, что цена товара в корзине хранится в объекте WC_Cart_Item и не пересчитывается автоматически при изменении количества, если мы хотим применить собственную логику.

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

Шаг 1. Подключение хука для изменения цены товара в корзине

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

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_based_on_quantity', 10, 1);

Шаг 2. Реализация функции изменения цены

В примере ниже реализована простая логика:

  • Если количество товара больше или равно 10 — цена уменьшается на 10%.
  • Если количество товара меньше 3 — цена увеличивается на 5%.
  • Во всех остальных случаях цена остаётся базовой.
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();

        if ( $quantity >= 10 ) {
            // Скидка 10%
            $new_price = $base_price * 0.9;
        } elseif ( $quantity < 3 ) {
            // Наценка 5%
            $new_price = $base_price * 1.05;
        } else {
            // Цена без изменений
            $new_price = $base_price;
        }

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

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

Чтобы проверить корректность работы решения:

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

Для дополнительной проверки откройте консоль браузера и посмотрите сетевые запросы AJAX — они должны корректно обновлять цену без ошибок.

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

  • Цена не меняется после обновления количества. Причина: хук подключён неправильно или функция не работает в AJAX-запросах. Проверьте, что функция подключена через add_action('woocommerce_before_calculate_totals') и в начале функции есть проверка if ( is_admin() && ! defined('DOING_AJAX') ) return;.
  • Цена меняется у всех товаров, даже если не нужно. Проверьте правильность условий в функции, например, не забывайте брать базовую цену именно через get_regular_price(), а не get_price().
  • Накладываются несколько фильтров и цена становится неправильной. Очищайте кеш объекта товара после установки цены или убедитесь, что не происходит двойного применения фильтра.
  • Конфликты с другими плагинами, изменяющими цену. Попробуйте менять приоритет хуков, например, ставьте приоритет 20 вместо 10 или наоборот.

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

  • Логика изменения цены должна быть максимально простой — тяжёлые вычисления лучше выносить в кэш или использовать transient API для хранения результатов.
  • Не используйте прямое изменение цены товара в базе, меняйте только цену в объекте корзины, чтобы не влиять на другие места сайта.
  • Тестируйте работу на разных версиях WooCommerce, особенно если пользуетесь кастомными шаблонами корзины.
  • Для сложных правил ценообразования рассмотрите использование готовых плагинов, например, Clearfy Pro, которые умеют гибко управлять скидками и ценами.

Сравнение вариантов реализации

МетодОписаниеПлюсыМинусы
Изменение цены через woocommerce_before_calculate_totalsХук для динамического изменения цены в корзинеГибко, напрямую влияет на цену, без изменения базыТребует правильной реализации, можно сломать расчёты
Использование плагинов скидокГотовые решения для создания правил ценПросто, настроек много, поддержкаМожет быть избыточно для простых задач, нагрузка
JS-скрипты для изменения цены на фронтендеИзменение цены через скрипты в корзинеБыстро и просто для отображенияЦена не меняется на сервере, не безопасно
Как создать собственный шорткод в WordPress
05.11.2025
Автоматическое удаление старых постов в WordPress по дате публикации
18.01.2026
Как настроить автоматический импорт данных из Google Sheets в WordPress с примерами кода
15.02.2026
Как установить и настроить OmniVideo в WordPress
25.02.2026
Как добавить автоматическую оптимизацию изображений в WordPress
29.03.2026