WooCommerce: автоматическое изменение цены товара при выполнении условий без плагинов

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

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

Основные причины, почему динамическое изменение цены не срабатывает:

  • Неправильное использование хука для изменения цены — нужно использовать woocommerce_before_calculate_totals, чтобы изменения применялись во время пересчёта корзины.
  • Отсутствие проверки, что цена изменяется только один раз — это приводит к бесконечному циклу пересчётов и ошибкам.
  • Изменение поля price вместо set_price() объекта товара в корзине.
  • Игнорирование влияния налогов, если они включены и влияют на итоговую стоимость.

Пошаговое решение: как правильно изменять цену товара в WooCommerce по условию

Шаг 1. Определяем условие для изменения цены

Например, изменим цену товара в корзине, если количество товара больше 3 штук.

Шаг 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;
    
    // Чтобы не применять скидку повторно при ajax или обновлении
    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'];
        $original_price = $product->get_regular_price();
        
        if ( $quantity > 3 ) {
            // Допустим, скидка 15% при покупке больше 3 штук
            $new_price = $original_price * 0.85;
            $product->set_price( $new_price );
        } else {
            // Восстанавливаем оригинальную цену, если условие не выполняется
            $product->set_price( $original_price );
        }
    }
}

Шаг 3. Кеш и сессии

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

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

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

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

1. Цены не меняются в корзине

  • Проверьте, что код подключён в functions.php активной темы или в плагине.
  • Убедитесь, что используете хук woocommerce_before_calculate_totals, а не woocommerce_calculate_totals.
  • Проверьте, что не происходит конфликт с другими плагинами, которые тоже меняют цены.

2. Цена меняется, но итоговая сумма в заказе не обновляется

  • Возможно, нужно добавить приоритет хука выше, попробуйте увеличить приоритет (меньше число) или наоборот, например 10 или 20.
  • Убедитесь, что не вызываете функцию изменения цены несколько раз, используйте проверку did_action.

3. Изменённая цена не учитывает налоги

  • Проверьте настройки налогов WooCommerce и попробуйте использовать методы изменения цены с учётом налогов (например, set_price работает с ценой без налогов, а отображение цены учитывает настройки налогов).

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

  • Не храните изменённые цены в базе — меняйте их только на стадии вычисления корзины, чтобы избежать рассогласования данных.
  • Используйте проверки is_admin() и DOING_AJAX, чтобы не запускать лишний код в админке.
  • Минимизируйте количество операций в цикле корзины для лучшей производительности.
  • Тестируйте изменения на тестовом стенде перед выкатом на продакшен.

Сравнение вариантов изменения цены в WooCommerce

ВариантПлюсыМинусыКомпромисс
Использование хука woocommerce_before_calculate_totalsГибко, работает без плагинов, изменение цены в реальном времениТребует аккуратности, возможны конфликты с другими хукамиЧётко проверять условия и избегать повторного применения
Плагины скидок и динамического ценообразованияПростота настройки, готовые решенияНагрузка на сайт, ограниченная кастомизация, платные версииИспользовать для сложных правил, если нет ресурсов на кастомный код
Изменение цены через JavaScript на фронтендеБыстро, без вмешательства в серверный кодЦена не изменяется на сервере, риск некорректных итоговИспользовать только для отображения, не для расчётов
WordPress: как правильно использовать мета-заголовки для SEO
10.01.2026
Как автоматизировать удаление старых пустых категорий в WordPress
23.03.2026
WooCommerce: решение проблемы не обновляющейся динамической цены товара в корзине
22.06.2026
WooCommerce: автоматическое удаление заказов со статусом Отменен и Возврат
01.07.2026
WooCommerce: как добавить автоматическое изменение цены товара при использовании промокода
10.05.2026