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

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

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

Какие показатели нужно проверить перед настройкой

  • Наличие актуальных остатков _stock в базе WooCommerce
  • Настроена ли поддержка управления запасами для товара
  • Тип товара (простой, вариативный) и поведение изменения цены для каждого типа

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

Реализуем изменение цены через хук woocommerce_before_calculate_totals, который позволяет корректировать цену в корзине динамически. Если нужно менять цену на странице товара, потребуется фильтр woocommerce_get_price.

Пример кода для простых товаров (functions.php темы или плагина):

add_action('woocommerce_before_calculate_totals', 'change_price_on_low_stock', 10, 1);
function change_price_on_low_stock($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    // Порог остатков
    $stock_threshold = 5;
    // Процент изменения цены (например, скидка 20%)
    $discount_percentage = 20;

    foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
        $product = $cart_item['data'];
        if (!$product->managing_stock()) continue;

        $stock_quantity = $product->get_stock_quantity();

        if ($stock_quantity <= $stock_threshold && $stock_quantity > 0) {
            $original_price = $product->get_regular_price();
            $new_price = $original_price * (1 - $discount_percentage / 100);
            $cart_item['data']->set_price($new_price);
        }
    }
}

Этот код применит скидку 20%, если остаток товара 5 или меньше, при добавлении в корзину.

Изменение цены на странице товара

Чтобы покупатель видел изменённую цену сразу, используйте фильтр:

add_filter('woocommerce_get_price', 'modify_price_display_based_on_stock', 10, 2);
function modify_price_display_based_on_stock($price, $product) {
    $stock_threshold = 5;
    $discount_percentage = 20;

    if ($product->managing_stock()) {
        $stock_quantity = $product->get_stock_quantity();
        if ($stock_quantity <= $stock_threshold && $stock_quantity > 0) {
            $price = $product->get_regular_price() * (1 - $discount_percentage / 100);
        }
    }

    return $price;
}

Проверка результата

  • Добавьте в WooCommerce товар с остатком 5 или меньше
  • Откройте страницу товара и проверьте, что цена изменилась согласно заданной логике
  • Добавьте товар в корзину, перейдите к оформлению заказа и убедитесь, что цена в корзине совпадает с изменённой
  • Измените остаток товара выше порога и проверьте, что цена возвращается к исходной

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

  • Цена не меняется в корзине или на странице товара: проверьте, что код добавлен в functions.php активной темы или в отдельный плагин и что нет конфликтов с другими плагинами, которые переопределяют цены.
  • Изменение цены применяется к товарам без управления запасами: добавьте проверку $product->managing_stock() и убедитесь, что это условие работает.
  • Проблемы с вариативными товарами: для вариативных товаров нужно изменить цену вариации, а не родительского товара. Используйте $product->is_type('variation') и работайте с объектом вариации.
  • Изменённая цена не отображается в виджетах или кэшированных блоках: очистите кэш и проверьте, что кэширование не мешает динамическому изменению цены.

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

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

Сравнение способов реализации изменения цены

МетодПреимуществаНедостаткиПример кода
Хук woocommerce_before_calculate_totals (корзина) Изменяет цену только в корзине и оформлении, безопасно Цена на странице товара не меняется, пользователь может быть не информирован Да (пример выше)
Фильтр woocommerce_get_price (отображение цены) Меняет цену на странице товара, пользователь видит актуальную цену Не меняет цену в заказе по умолчанию, нужно дополнительно менять в корзине Да (пример выше)
Изменение цены в базе данных Постоянное изменение цены, подходит для длительных акций Риск ошибок, требует отката изменений, может сломать отчёты и аналитику Не рекомендуется
Как создать пользовательские роли и настройки для них в WordPress
26.01.2026
Как удалить неиспользуемые метаданные в WordPress для оптимизации сайта
10.12.2025
Автообновление тем и плагинов в WordPress: настройка и контроль
02.12.2025
Как удалить пользовательский аккаунт со всеми данными в WordPress
19.02.2026
Как добавить динамические параметры в URL в WordPress
30.03.2026