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

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

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

Типичные сценарии:

  • Скидка при покупке более 5 штук одного товара;
  • Изменение цены для оптовых покупателей;
  • Временные акции с динамическим изменением стоимости;
  • Персональные цены для определённых ролей пользователей.

Как проверить, что ваша тема и плагины не мешают изменению цены

Перед настройкой автоматической цены убедитесь, что:

  • Тема не переопределяет WooCommerce хуки для цены;
  • Другие плагины не блокируют изменение цены (кэширование, оптимизация, кэш страниц);
  • Вы работаете с простой или вариативной моделью товара, т.к. код будет отличаться.

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

Пошаговое решение: код для автоматического изменения цены товара в корзине

Реализуем пример: если в корзине больше 5 единиц товара с ID 123, цена снижается на 10%.

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price', 20, 1);
function custom_dynamic_price( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return;
    if ( did_action('woocommerce_before_calculate_totals') >= 2 ) return;

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product_id = $cart_item['product_id'];
        $quantity = $cart_item['quantity'];

        if ( $product_id == 123 && $quantity >= 5 ) {
            $original_price = $cart_item['data']->get_regular_price();
            $discounted_price = $original_price * 0.9; // Снижение на 10%
            $cart_item['data']->set_price( $discounted_price );
        }
    }
}

Объяснение кода

  • Хук woocommerce_before_calculate_totals позволяет изменить цену в корзине до подсчёта итогов;
  • Проверяем, что не в админке и не дублируем вызов;
  • Для каждого товара проверяем ID и количество;
  • Если условие выполняется, устанавливаем новую цену.

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

Добавьте в корзину товар с ID 123 в количестве больше 5 и проверьте цену в корзине. Если скидка сработала, вы увидите уменьшенную цену на 10% по сравнению с обычной.

Для проверки можно:

  • Посмотреть цены на странице корзины и оформления заказа;
  • Сделать тестовый заказ и проверить итоговую сумму в админке WooCommerce;
  • Включить режим отладки WooCommerce и просмотреть логи.

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

  • Изменение цены не применяется: проверьте порядок подключения хука и отключите кэш плагинов;
  • Цена меняется, но итог в заказе не пересчитывается: убедитесь, что хук использует версию WooCommerce 3.0+ и нет конфликтов в коде;
  • Цена меняется для всех товаров: проверьте условие ID товара и количество;
  • Изменение цены портит вариативные товары: для вариативных товаров используйте метод get_variation_id() и меняйте цену на объекте вариации.

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

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

Таблица сравнения подходов к автоматическому изменению цены

МетодПреимуществаНедостаткиПример использования
Хуки WooCommerce (напр. woocommerce_before_calculate_totals)Легко интегрируется, не требует плагинов, гибкостьТребует навыков PHP, можно ошибиться с условиямиСкидки в корзине по количеству
Плагины скидок (например, WooCommerce Dynamic Pricing)Простой интерфейс, много условий, поддержкаДоп. нагрузка, плата, ограниченная гибкость без кодаСложные правила скидок без программирования
Изменение цен в базе данныхПостоянные изменения, не зависит от корзиныОпасно, может нарушить логику WooCommerceРедкие случаи, когда нужно фиксировать цены
Как автоматически переводить посты WordPress на другие языки
02.03.2026
WooCommerce: как отключить возможность повторного добавления товара в корзину
25.05.2026
Как отключить автоматический выход из WordPress: практические решения
25.01.2026
WordPress: устройство, настройка и оптимизация очистки базы данных
30.01.2026
Как удалить кэш в WordPress: практические методы и советы
15.01.2026