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

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

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

Типичные вопросы, которые возникают при реализации:

  • Как автоматически менять цену товара в корзине без изменения основной цены в админке?
  • Как сделать так, чтобы изменение цены было видно и в заказе, и в админке после оформления?
  • Какие хуки использовать для правильного обновления цены?

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

1. Выбор подходящего хука

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

2. Пример: скидка 10% при покупке от 5 штук

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) {
        $quantity = $cart_item['quantity'];
        $original_price = $cart_item['data']->get_regular_price();
        if ($quantity >= 5) {
            $new_price = $original_price * 0.9; // 10% скидка
            $cart_item['data']->set_price($new_price);
        } else {
            $cart_item['data']->set_price($original_price); // сброс цены при меньшем количестве
        }
    }
}

3. Учет роли пользователя: дополнительная скидка для оптовиков

add_action('woocommerce_before_calculate_totals', 'custom_price_for_wholesale_users', 20, 1);
function custom_price_for_wholesale_users($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;
    
    $user = wp_get_current_user();
    if (in_array('wholesale_customer', (array) $user->roles)) {
        foreach ($cart->get_cart() as $cart_item) {
            $price = $cart_item['data']->get_regular_price();
            $discounted_price = $price * 0.85; // 15% скидка для оптовиков
            $cart_item['data']->set_price($discounted_price);
        }
    }
}

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

  1. Добавьте товар в корзину с количеством 4 — цена должна быть без скидки.
  2. Увеличьте количество до 5 или больше — цена должна уменьшиться на 10%.
  3. Авторизуйтесь под пользователем с ролью wholesale_customer и проверьте, что скидка 15% применяется ко всем товарам.
  4. Оформите заказ и проверьте, что итоговые цены в админке и в письмах совпадают с изменёнными.

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

  • Скидка не применяется или цена сбрасывается после обновления корзины. Причина: не использовать правильный хук или не сбрасывать цену при условии. Решение: всегда устанавливайте цену, даже если скидка не применяется.
  • Изменение цены влияет на базовую цену товара в админке. Причина: изменение не только в корзине, а в объекте продукта глобально. Решение: использовать set_price() только в корзине и не сохранять изменения в базе.
  • Проблемы с кешированием или отображением в AJAX. Решение: проверять условие if (is_admin() && !defined('DOING_AJAX')) return; для исключения админ-панели.

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

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

Сравнение вариантов реализации динамической цены

ВариантПлюсыМинусыПример
Использование хуков WooCommerce (set_price в корзине)Гибко, не меняет базу, хорошо интегрируетсяТребует кодирования, может конфликтовать с плагинами скидокПример кода выше
Плагины скидок и динамических ценПростота настройки, готовый UIСтоимость, потенциальные конфликты, ограниченная гибкостьWooCommerce Dynamic Pricing & Discounts
Изменение цены через мета-поля и сохранениеВидно в админке сразуРиск рассинхронизации, сложность поддержкиНе рекомендуется
Как сделать многоуровневый фильтр в WordPress на примере товаров
04.04.2026
WooCommerce: как автоматически отключать товары без продаж через код
01.07.2026
Как сделать защищённые зоны доступа в WordPress
15.12.2025
Как сделать автоматический откат обновлений WordPress при ошибках
10.04.2026
Как создать автоматический ответчик в комментариях WordPress
26.02.2026