WooCommerce: автоматическое изменение цены при низком остатке товара

Проблема: необходимость динамически изменять цену товара при снижении остатка

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

Диагностика задачи и варианты решения

Первый шаг — определить, как именно должна изменяться цена:

  • Простое уменьшение/увеличение цены на фиксированную сумму или процент;
  • Установка новой фиксированной цены;
  • Временное изменение цены (например, до пополнения склада).
Далее нужно решить, когда срабатывать изменению цены:
  • При обновлении остатка (ручном или автоматическом);
  • Периодически через WP-Cron;
  • При загрузке страницы товара или корзины (неэффективно и не рекомендуется).

Оптимальный вариант — менять цену сразу при обновлении остатка, чтобы цена была актуальна для покупателей.

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

1. Создание функции для проверки остатка и изменения цены товара

function wpdir_update_price_on_low_stock( $product_id ) {
    $product = wc_get_product( $product_id );
    if ( ! $product || ! $product->managing_stock() ) {
        return;
    }

    $stock_quantity = $product->get_stock_quantity();
    $low_stock_threshold = 5; // Порог остатка

    // Проверяем, ниже ли остаток порога
    if ( $stock_quantity !== null && $stock_quantity <= $low_stock_threshold ) {
        // Новая цена - снижение на 10%
        $regular_price = (float) $product->get_regular_price();
        $new_price = round( $regular_price * 0.9, 2 );

        // Устанавливаем новую цену
        $product->set_price( $new_price );
        $product->save();
    } else {
        // Если остаток выше порога - вернуть стандартную цену
        $regular_price = $product->get_regular_price();
        $product->set_price( $regular_price );
        $product->save();
    }
}

2. Подключение функции к хуку изменения запаса

WooCommerce не имеет прямого хука на изменение запаса, но можно использовать woocommerce_product_set_stock, который вызывается при обновлении количества товара.

add_action( 'woocommerce_product_set_stock', 'wpdir_update_price_on_low_stock', 10, 1 );

3. Проверка работы решения

Для тестирования:

  1. Откройте товар в админке WooCommerce.
  2. Измените количество запаса на число ниже или равное 5.
  3. Сохраните изменения.
  4. Проверьте, изменилась ли цена товара в карточке товара на сайте (снижение на 10%).
  5. Если увеличить запас выше 5, цена должна вернуться к оригинальной.

Чек-лист для отладки и проверки

  • Убедитесь, что у товара включён учёт запасов (manage_stock = true).
  • Включён ли хук woocommerce_product_set_stock (не переопределяется ли где-то).
  • Вызываете ли сохранение товара через админку, чтобы сработал хук.
  • Проверьте, что цены обновляются и сохраняются корректно.
  • Проверьте, что цена возвращается к оригинальной при увеличении запаса.

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

1. Изменение цены не происходит

  • Проверьте, что хук woocommerce_product_set_stock действительно срабатывает. Для этого временно добавьте error_log('Hook triggered for product ' . $product_id); внутрь функции.
  • Убедитесь, что у товара активирован учёт запасов.

2. Цена меняется, но не отображается на сайте

  • Возможно, кэширование страницы или объекта товара. Очистите кэш сайта и браузера.
  • Проверьте, не переопределяется ли цена другими плагинами или темой.

3. Некорректное округление или установка цены

  • Используйте функцию round($value, 2) для округления цены до двух знаков.
  • Проверяйте, что цена всегда положительна и не равна нулю.

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

  • Не используйте для изменения цены хуки, срабатывающие при загрузке фронтенда (например, template_redirect) — это замедлит сайт.
  • Обрабатывайте изменение цены только при изменении запаса, чтобы минимизировать лишние запросы к базе.
  • Резервируйте исходную цену в метаполе, если планируете более сложные сценарии возврата цены.
  • Обязательно тестируйте изменения на тестовом стенде, чтобы избежать сбоев на живом сайте.
  • Если используете кэширование (например, object cache), очищайте кэш после изменения цены.

Сравнение решений: плагин vs. кастомный код

КритерийПлагинКастомный код (как в статье)Компромисс
ГибкостьСредняя, зависит от плагинаПолная, можно адаптировать под любые требованияКод требует поддержки
ПроизводительностьМожет замедлять сайтОптимизирован под задачуНужны тесты и оптимизация
Сложность внедренияПросто установить и настроитьТребуется разработчикСредняя, зависит от уровня знаний
БезопасностьЗависит от качества плагинаЗависит от кодаКонтроль выше при кастоме
WooCommerce: Автоматическое удаление товаров при нулевом остатке
06.06.2026
WooCommerce: Автоматическое удаление неактивных заказов по дате
19.05.2026
WooCommerce: автоматическое удаление неактивных товаров по дате последнего изменения
02.05.2026
Как создать пользовательские роли и настройки для них в WordPress
26.01.2026
WooCommerce: автоматическое удаление товаров при нулевом остатке и без вариаций
15.06.2026