WooCommerce: автоматическое изменение наличия и стоимости товара при оформлении заказа

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

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

Основные симптомы, что нужно автоматизировать:

  • Клиенты видят некорректную цену на странице товара, учитывая опции, доступные только при заказе;
  • Наличие товара не обновляется при оформлении заказа, что ведёт к ошибкам в учёте;
  • Необходимо менять цену товара в корзине и на странице оформления заказа без перезагрузки страницы.

Пошаговое решение: автоматическое обновление цены и наличия товара в WooCommerce

1. Изменение цены товара в корзине через хук woocommerce_before_calculate_totals

Для динамического изменения цены товара в корзине используем хук woocommerce_before_calculate_totals. В примере ниже меняем цену товара на 90% от базовой, если выполнено определённое условие (например, количество товара более 3 штук).

add_action('woocommerce_before_calculate_totals', 'custom_dynamic_price_change', 10, 1);function custom_dynamic_price_change( $cart ) {    if ( is_admin() && ! defined( 'DOING_AJAX' ) )        return;    // Пробегаем по товарам в корзине    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {        $product = $cart_item['data'];        $qty = $cart_item['quantity'];        // Условие: если количество товара больше 3 штук        if ( $qty > 3 ) {            // Устанавливаем цену 90% от базовой            $new_price = $product->get_regular_price() * 0.9;            $product->set_price( $new_price );        }    }}

2. Изменение статуса наличия товара после оформления заказа

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

add_action( 'woocommerce_thankyou', 'custom_update_stock_after_order' );function custom_update_stock_after_order( $order_id ) {    if ( ! $order_id ) return;    $order = wc_get_order( $order_id );    foreach ( $order->get_items() as $item_id => $item ) {        $product = $item->get_product();        $qty = $item->get_quantity();        if ( $product && $product->managing_stock() ) {            // Уменьшаем остаток на складе            $stock_quantity = $product->get_stock_quantity();            $new_stock = max( 0, $stock_quantity - $qty );            $product->set_stock_quantity( $new_stock );            // Обновляем статус наличия            if ( $new_stock == 0 ) {                $product->set_stock_status( 'outofstock' );            } else {                $product->set_stock_status( 'instock' );            }            $product->save();        }    }}

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

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

  • Добавляем в корзину товар с количеством больше 3 — в корзине и на странице оформления заказа цена должна измениться на 90% от базовой;
  • Оформляем заказ с этими товарами, после успешной оплаты проверяем в админке WooCommerce остаток товара и статус наличия — количество должно уменьшиться, а при достижении нуля статус изменится на «Нет в наличии»;
  • Проверяем в интерфейсе пользователя, что статус товара обновился и отображается правильно.

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

  • Изменение цены не применяется: проверьте, что при использовании woocommerce_before_calculate_totals вы не вызываете функцию несколько раз, и что код не работает в админке (проверка is_admin() и DOING_AJAX);
  • Статус наличия не обновляется: убедитесь, что у товара включено управление складом (managing_stock() возвращает true) и что вы вызываете $product->save() после изменений;
  • Ошибка при получении заказа: проверьте, что ID заказа передаётся в функцию и что используете wc_get_order() корректно;
  • Сбои при массовом обновлении: учитывайте нагрузку на сервер при большом количестве товаров в заказе, по возможности ограничивайте обработку или реализуйте очередь;
  • Цена меняется везде, а нужно только в корзине: не изменяйте базовую цену товара глобально, только в объекте корзины.

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

  • Для массовых магазинов с большим количеством заказов разграничьте операции по обновлению остатков, чтобы избежать блокировок базы данных;
  • Используйте проверку nonce и права доступа, если планируете расширять функционал через AJAX;
  • Кэширование: отключайте кэширование страниц для корзины и оформления заказа, чтобы изменения цен и наличия отражались сразу;
  • Для сложных условий ценообразования лучше использовать специализированные плагины, например, WooCommerce Dynamic Pricing, если функционала самописного кода не хватает;
  • Следите за обновлениями WooCommerce и тестируйте кастомный код после обновлений, чтобы избежать конфликтов с API.

Сравнение вариантов реализации автоматического изменения цены и наличия в WooCommerce

МетодПлюсыМинусыПример кода
Хуки WooCommerce (как в статье)Полный контроль, без лишних плагинов, гибкостьНужно писать и поддерживать код, риск ошибокВ статье выше
Плагины динамического ценообразованияПростая настройка, поддержка, расширенный функционалСтоимость, нагрузка на сайт, ограниченная кастомизацияWooCommerce Dynamic Pricing
Внешние сервисы и интеграцииАвтоматизация, аналитика, масштабируемостьСложность интеграции, дополнительные расходыЗависит от сервиса
WooCommerce: автоматическое изменение наличия товара после успешной оплаты
12.05.2026
Как создать собственный шорткод с атрибутами в WordPress
16.11.2025
Как изменить тип записи (post type) в WordPress без потери SEO и ссылок
10.12.2025
Как использовать омнинаправленные хуки в WordPress для распространённых задач
22.02.2026
WooCommerce: автоматическое изменение наличия и стоимости товара при оформлении заказа
09.05.2026

На оформлении, скоро здесь появится полноценный ресурс