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

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

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

Основные симптомы, которые указывают на необходимость решения:

  • Цены не меняются при изменении остатков товара.
  • Ручное управление ценами слишком трудоёмко при большом количестве товаров.
  • Желание использовать динамическое ценообразование для повышения продаж и управления запасами.

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

1. Использование хука woocommerce_before_calculate_totals для динамического изменения цены в корзине

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

add_action('woocommerce_before_calculate_totals', 'change_price_based_on_stock', 10, 1);
function change_price_based_on_stock( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
    foreach ( $cart->get_cart() as $cart_item ) {
        $product = $cart_item['data'];
        $stock_quantity = $product->get_stock_quantity();
        if ( $stock_quantity !== null && $stock_quantity <= 5 ) { // порог 5
            $new_price = $product->get_regular_price() * 0.9; // скидка 10%
            $product->set_price( $new_price );
        }
    }
}

2. Изменение цены на страницах каталога и карточке товара

Чтобы цена менялась в каталоге и на странице товара, можно использовать фильтр woocommerce_get_price:

add_filter( 'woocommerce_get_price', 'filter_price_based_on_stock', 10, 2 );
function filter_price_based_on_stock( $price, $product ) {
    $stock_quantity = $product->get_stock_quantity();
    if ( $stock_quantity !== null && $stock_quantity <= 5 ) {
        return $product->get_regular_price() * 0.9; // скидка 10%
    }
    return $price;
}

3. Автоматическое обновление цен при изменении остатков (опционально)

Если используется сторонняя система складского учёта и остатки обновляются через REST API или импорт, стоит вызвать пересчёт цен через cron или при обновлении товара. Для этого можно использовать хук save_post_product:

add_action( 'save_post_product', 'update_price_on_stock_change', 20, 1 );
function update_price_on_stock_change( $post_id ) {
    $product = wc_get_product( $post_id );
    if ( ! $product ) return;
    $stock_quantity = $product->get_stock_quantity();
    if ( $stock_quantity !== null && $stock_quantity <= 5 ) {
        $new_price = $product->get_regular_price() * 0.9;
        $product->set_price( $new_price );
        $product->save();
    }
}

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

  • Перейдите на страницу товара с остатком ≤ 5 и убедитесь, что цена отображается со скидкой 10%.
  • Добавьте товар в корзину и проверьте цену в корзине.
  • Обновите остаток товара в админке на большее значение и проверьте, что цена вернулась к обычной.

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

  • Изменение цены не отображается на фронтенде. Убедитесь, что тема не кеширует цены, очистите кеш браузера и плагинов кэширования.
  • Цена меняется в корзине, но не на странице товара. Используйте оба метода: и фильтр woocommerce_get_price, и хук woocommerce_before_calculate_totals.
  • Изменённая цена не сохраняется в базе. Для динамического изменения цены не рекомендуется менять базовую цену товара, лучше использовать фильтры и хуки.
  • Проблемы с совместимостью плагинов кеширования. Настройте исключения для страниц WooCommerce или используйте AJAX для обновления цены.

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

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

Сравнение подходов: код vs плагины

МетодПреимуществаНедостаткиКомпромисс
Ручной код на хуках Гибкость, отсутствие зависимостей, точечное управление Требует навыков, возможны ошибки, не всегда удобно для большого каталога Использовать вместе с WP-Cron для автоматизации
Плагины динамического ценообразования Готовые решения, интерфейс, поддержка Стоимость, нагрузка, ограниченная кастомизация Выбирать проверенные плагины, комбинировать с кастомными фильтрами
Как создать плагин для автоматического удаления старых постов через 30 дней в WordPress
31.12.2025
Удаление неиспользуемых taxonomy terms в WordPress: пошаговое руководство
26.02.2026
Как настроить автоматический rollback обновлений в WordPress
19.03.2026
WooCommerce: автоматическое удаление товаров при отсутствии на складе
18.07.2026
Как добавить владельца поста в REST API WordPress
30.01.2026

Совсем скоро здесь откроется ресурс о вордпресс.