WooCommerce: автоматическое изменение наличия товара после успешной оплаты

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

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

Без автоматического обновления есть риск:

  • продажи товаров, которых нет на складе;
  • недовольство клиентов из-за отмен заказов;
  • ошибки в учете складских остатков.

Как отследить успешную оплату заказа в WooCommerce

Для автоматизации нужно поймать момент, когда заказ переходит в статус processing или completed. Это значит, что оплата прошла успешно.

Для этого используется хук woocommerce_order_status_changed. Он срабатывает при изменении статуса заказа и передает старый и новый статусы, а также объект заказа.

Пример базового кода для отлова изменения статуса

add_action('woocommerce_order_status_changed', 'custom_update_product_stock_on_paid', 10, 4);
function custom_update_product_stock_on_paid($order_id, $old_status, $new_status, $order) {
    if ( in_array($new_status, array('processing', 'completed')) ) {
        // Логика обновления наличия
    }
}

Пошаговое решение: автоматическая установка товара в "нет в наличии" после оплаты

Задача: после успешной оплаты перевести товары из заказа в статус "нет в наличии" (outofstock). Пример решения:

  1. Подключаемся к хуку woocommerce_order_status_changed для отслеживания оплаты.
  2. Извлекаем товары из заказа вместе с их ID.
  3. Для каждого товара обновляем поле stock_status на outofstock.
  4. Обновляем кэш и вызываем функции WooCommerce для пересчёта запасов.

Код для автоматизации

add_action('woocommerce_order_status_changed', 'wc_set_products_outofstock_after_payment', 10, 4);
function wc_set_products_outofstock_after_payment($order_id, $old_status, $new_status, $order) {
    if ( ! in_array($new_status, array('processing', 'completed')) ) {
        return;
    }

    if ( ! $order instanceof WC_Order ) {
        $order = wc_get_order($order_id);
    }

    foreach ( $order->get_items() as $item ) {
        $product = $item->get_product();
        if ( $product && $product->managing_stock() ) {
            $product->set_stock_status('outofstock');
            $product->save();
        }
    }
}

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

  • Создайте тестовый заказ с оплачиваемым товаром, у которого на складе есть запас.
  • Переведите заказ в статус processing вручную или через оплату.
  • Перейдите в админку WooCommerce — Товары и проверьте статус товара. Он должен измениться на "Нет в наличии".
  • Попробуйте добавить этот товар в корзину — должно быть невозможно из-за отсутствия наличия.

Частые ошибки и способы их устранения

  • Не срабатывает обновление статуса товара
    Проверьте, что хук подключен и функция вызывается. Для отладки добавьте error_log() внутри функции.
  • Обновляется не тот товар
    Убедитесь, что вы получаете объект WC_Product через $item->get_product(), а не ID товара напрямую.
  • Не учитываются вариации
    Для вариативных товаров убедитесь, что обновляете статус вариации, а не родительского товара.
  • Проблемы с кешированием
    Если используется кеширование WooCommerce или плагинов, очистите кеш после обновления товара.

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

  • Добавляйте проверку прав пользователя, если используете функции в админке.
  • Не обновляйте товары без необходимости — например, делайте проверку текущего статуса перед изменением.
  • Если товаров в заказе много, выполняйте обновления пакетно или с ограничением времени выполнения.
  • Для массового обновления статусов используйте WP-CLI, если это подходит.

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

МетодПлюсыМинусыПримеры
Ручной код в functions.phpПолный контроль, нет зависимостейТребует навыков, ошибки влияют на работу сайтаПример из статьи
Плагины управления складомГотовый функционал, поддержкаМожет грузить сайт, платные версииWooCommerce Stock Manager, ATUM Inventory
Внешние сервисы с синхронизациейАвтоматизация, интеграция с 1С и CRMСложная настройка, стоимостьZapier, интеграции с ERP
WooCommerce: автоматическое изменение стоимости товара и удаление из корзины через AJAX без перезагрузки
03.05.2026
WooCommerce: автоматическое изменение стоимости товара при определённых условиях
29.04.2026
Как создать адаптивный видео плеер в WordPress с использованием OmniVideo
28.02.2026
Как создать автоматическое удаление старых чрезмерных ревизий в WordPress
15.12.2025
Как создать автоматические отзывы в WordPress с помощью WPRemark
16.03.2026

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