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

Диагностика задачи: зачем нужна автоматическая смена цены в WooCommerce

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

Пример: нужно снизить цену на 10% для определённых товаров при покупке от 3 штук или сделать скидку в вечерние часы.

Подходы к решению задачи

Есть три основных способа:

  • Использовать стандартные возможности WooCommerce — цены со скидками, купоны, цены по ролям через плагины;
  • Применять сторонние плагины для динамического ценообразования;
  • Реализовать кастомный код на PHP с использованием хуков WooCommerce.

Для гибкости и конкретных условий лучше подходит третий вариант.

Реализация: использование фильтра woocommerce_get_price для динамического изменения цены

Хук woocommerce_get_price позволяет перехватывать запрос цены товара. Его можно использовать для изменения цены на лету без изменения данных в базе.

Пример кода для скидки 10% при покупке 3 и более товаров определённого типа (например, по категории 'sale'):

add_filter('woocommerce_get_price', 'custom_dynamic_price', 10, 2);
function custom_dynamic_price($price, $product) {
    if (is_admin()) return $price; // не трогаем админку

    // Проверяем, что товар из нужной категории
    if (has_term('sale', 'product_cat', $product->get_id())) {
        // Получаем количество товара в корзине
        $cart = WC()->cart;
        if (!$cart) return $price;

        $qty = 0;
        foreach ($cart->get_cart() as $cart_item) {
            if ($cart_item['product_id'] == $product->get_id()) {
                $qty += $cart_item['quantity'];
            }
        }

        // Если в корзине 3 и более, даём скидку 10%
        if ($qty >= 3) {
            $price = $price * 0.9;
        }
    }
    return $price;
}

Как внедрить код

  • Добавьте этот код в файл functions.php вашей дочерней темы или в кастомный плагин.
  • Убедитесь, что категория 'sale' существует и назначена нужным товарам.
  • Проверьте работу на фронтенде, добавляя в корзину нужное количество товара.

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

Чтобы проверить, что цена меняется правильно:

  • Откройте сайт в режиме инкогнито или выйдите из админки;
  • Добавьте 1 товар из категории 'sale' в корзину — цена должна быть базовой;
  • Добавьте 3 и более — цена должна снизиться на 10%;
  • Проверьте, что в админке цены не изменились (только отображение для пользователя).

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

  • Цена не меняется: возможно, корзина еще не инициализирована, попробуйте обернуть проверку WC()->cart в условие if ( did_action( 'woocommerce_before_calculate_totals' ) ) или подключите фильтр woocommerce_before_calculate_totals для более надёжного изменения цены.
  • Цена меняется и в админке: добавьте проверку if (is_admin()) return $price; в начале функции.
  • Скидка применяется ко всем товарам: проверьте правильность категории и ID товара в условии.
  • Проблемы с кешированием: убедитесь, что кеш на сайте и сервере не мешает отобразить актуальную цену.

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

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

Альтернативы: плагины для динамических цен

ПлагинОписаниеПлюсыМинусы
WooCommerce Dynamic PricingГибкая настройка правил ценообразованияМного условий, UI для настройки без кодаПлатный, может нагружать сайт
Discount Rules for WooCommerceПравила скидок с поддержкой разных условийБесплатная версия, удобный интерфейсОграничения в бесплатной версии
Кастомный код (пример выше)Полный контроль, минимальная нагрузкаНет зависимости от сторонних плагиновТребует навыков разработки, не всем удобен
Создание собственных типов записей (Custom Post Types) в WordPress с примерами кода
31.01.2026
Как добавить AJAX фильтрацию товаров в WordPress для малого бизнеса
14.03.2026
Как сделать автоматическую сборку и оптимизацию CSS в WordPress
22.01.2026
Как создать автоматический импорт постов из RSS в WordPress
10.03.2026
Как удалить версию WordPress из HTML кода сайта
21.11.2025