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

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

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

Пример реальной ситуации: магазин хочет автоматически снижать цену на товар на 10%, если в корзине больше 5 единиц этого товара, или давать скидку постоянным клиентам с ролью "subscriber".

Как реализовать автоматическое изменение цены товара в WooCommerce через код

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

Пошаговое решение

  1. Создайте дочернюю тему или используйте плагин для пользовательских функций.
  2. Добавьте следующий код в файл functions.php дочерней темы или в плагин:
add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_adjustment', 10, 1); 
function custom_dynamic_price_adjustment( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return;

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        $quantity = $cart_item['quantity'];
        $user = wp_get_current_user();

        $original_price = floatval( $product->get_regular_price() );
        $new_price = $original_price;

        // Условие 1: скидка 10% при количестве товара > 5
        if ( $quantity > 5 ) {
            $new_price = $original_price * 0.9;
        }

        // Условие 2: скидка 15% для пользователей с ролью 'subscriber'
        if ( in_array( 'subscriber', (array) $user->roles ) ) {
            $new_price = $new_price * 0.85;
        }

        // Применяем новую цену
        $product->set_price( $new_price );
    }
}

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

  • woocommerce_before_calculate_totals — хук, позволяющий изменить цену перед подсчётом суммы.
  • В цикле проходим по товарам в корзине и получаем исходную цену.
  • Проверяем условия: количество и роль пользователя.
  • Корректируем цену и устанавливаем её через set_price().

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

1. Добавьте в корзину более 5 единиц одного товара — цена должна уменьшиться на 10%.

2. Войдите под пользователем с ролью subscriber и добавьте товар в корзину — цена должна уменьшиться ещё на 15% от уже изменённой цены.

3. Проверьте итоговую цену в корзине и на странице оформления заказа — она должна соответствовать условиям.

4. Для проверки можно временно добавить вывод цены в консоль браузера или использовать error_log() для отладки.

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

  • Цена не меняется: Проверьте, что ваш код подключён и хук не блокируется. Убедитесь, что is_admin() условие не препятствует работе на фронтенде.
  • Цена меняется, но итоговая сумма не обновляется: Очистите кеш и перезагрузите страницу корзины. Проверьте, что не используется кэширование цен или сторонние плагины, блокирующие изменение цены.
  • Скидка применяется неверно или суммируется некорректно: Проверьте порядок условий в коде и логику умножения цен.
  • Изменение цены влияет на другие части сайта: Убедитесь, что изменение цены происходит только в корзине, а не на странице товара (хук срабатывает именно на корзине).

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

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

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

МетодПлюсыМинусыКогда использовать
Код в functions.php с хукомПолный контроль, бесплатно, гибкостьТребует навыков, возможны ошибкиПростые и средние правила скидок
Плагины для динамических ценГотовые решения, удобство, поддержкаПлатно, может грузить сайтСложные акции, маркетинг
Ручное изменение ценПросто, без кодаНеавтоматично, риск ошибокРедкие изменения
Как создать многоязычный сайт на WordPress
21.11.2025
WooCommerce: автоматическое возврат средств после отмены заказа
07.05.2026
Как в WooCommerce отключить корзину и сразу вести к оформлению заказа
09.08.2026
Как создать автоматические уведомления на WordPress с помощью AJAX и плагинов
17.03.2026
Как создать персонализированные типы записей в WordPress: практические примеры и код
25.11.2025