Автоматическое изменение стоимости товаров в WooCommerce при снижении остатка на складе

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

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

Стандартный WooCommerce не предлагает встроенных инструментов для динамического изменения цены на основе количества товара. Обычно такие задачи решаются через кастомный код или сторонние плагины.

Как проверить текущую ситуацию в WooCommerce

  • В админке перейдите в Товары → Все товары.
  • В столбце Остаток обратите внимание на количество у товаров с управлением запасами.
  • Проверьте, включено ли управление запасами (галочка Управлять запасами? в настройках товара).
  • Проверьте, нет ли уже активных правил или плагинов для динамической цены (например, Dynamic Pricing).

Пошаговое решение: автоматическое изменение цены товара при снижении остатка ниже порога

1. Определяем порог и цель

В нашем примере порог — 5 единиц товара. Если остаток меньше или равен 5, мы уменьшаем цену на 10%. Если больше — цена возвращается к базовой.

2. Добавляем код в файл functions.php темы или в отдельный плагин

add_action('save_post_product', 'wc_update_price_based_on_stock', 20, 3); // При сохранении товара
function wc_update_price_based_on_stock($post_id, $post, $update) {
    if ($post->post_type !== 'product') {
        return;
    }

    $product = wc_get_product($post_id);
    if (!$product->managing_stock()) {
        return; // Управление запасами не включено
    }

    $stock_quantity = $product->get_stock_quantity();
    $regular_price = (float) $product->get_regular_price();

    $threshold = 5; // Порог
    $discount_percent = 10; // Скидка 10%

    if ($stock_quantity !== null && $stock_quantity <= $threshold) {
        // Вычисляем новую цену
        $new_price = round($regular_price * (1 - $discount_percent / 100), 2);
        $product->set_price($new_price);
        $product->set_sale_price($new_price);
    } else {
        // Возвращаем цену к обычной
        $product->set_sale_price('');
        $product->set_price($regular_price);
    }

    $product->save();
}

3. Обработка изменения остатков при покупке

Чтобы цена менялась сразу при изменении количества на складе (например, после оформления заказа), добавим хук на обновление запасов:

add_action('woocommerce_reduce_order_stock', 'wc_update_price_after_stock_change', 10, 1);
function wc_update_price_after_stock_change($order) {
    foreach ($order->get_items() as $item) {
        $product = $item->get_product();
        if ($product && $product->managing_stock()) {
            $stock_quantity = $product->get_stock_quantity();
            $regular_price = (float) $product->get_regular_price();
            $threshold = 5;
            $discount_percent = 10;

            if ($stock_quantity !== null && $stock_quantity <= $threshold) {
                $new_price = round($regular_price * (1 - $discount_percent / 100), 2);
                $product->set_price($new_price);
                $product->set_sale_price($new_price);
            } else {
                $product->set_sale_price('');
                $product->set_price($regular_price);
            }
            $product->save();
        }
    }
}

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

  • Создайте тестовый товар с управлением запасами и установите цену, например, 1000 рублей.
  • Установите остаток товара >5 и сохраните — цена должна оставаться 1000.
  • Измените остаток товара на 5 или меньше и сохраните — цена должна автоматически уменьшиться на 10% (до 900 рублей).
  • Оформите тестовый заказ, который уменьшит остаток ниже порога, и проверьте, что цена обновилась.
  • Если кэширование включено, очистите кэш сайта и браузера.

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

  • Цена не меняется после изменения остатка: возможно, кэширование блокирует обновление цены. Очистите кэш и проверьте, используете ли хуки правильно.
  • Цена меняется, но не отображается на сайте: тема или плагин могут кэшировать цены. Проверьте шаблоны и отключите сторонние кеширующие решения временно.
  • Ошибки PHP или сбои после добавления кода: проверьте синтаксис, используйте логи ошибок. Код должен добавляться в child тему или отдельный плагин.
  • Управление запасами выключено на товаре: код игнорирует такие товары, включите управление запасами.

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

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

Сравнение вариантов реализации

ВариантПлюсыМинусы
Кастомный код (хуки save_post_product и woocommerce_reduce_order_stock)Полный контроль, бесплатно, гибкоТребует навыков разработки, может конфликтовать с другими плагинами
Плагин Dynamic PricingГотовое решение, интерфейс настройкиПлатный, возможно избыточен для простой задачи, нагрузка на сайт
Ручное изменение ценПростотаНеэффективно, требует постоянного контроля
Оптимизация загрузки изображений в WordPress для повышения скорости сайта
11.12.2025
Автоматический импорт товаров в WooCommerce из CSV: практическое руководство
22.02.2026
Как удалить повторяющиеся товары в WooCommerce без плагинов
24.05.2026
WooCommerce: автоматический обзвон покупателей после оформления заказа
16.05.2026
Автоматическое удаление старых медиафайлов в WordPress
03.04.2026