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

Что делать, если нужно менять статус товара при обновлении заказа в WooCommerce

В стандартном WooCommerce нет механизма, который бы автоматически менял статус товаров (например, переводил их в "нет в наличии" или "архивирован") при изменении статуса связанных заказов. Это часто требуется, если магазин хочет, например, скрывать товары после продажи или управлять их доступностью в зависимости от активности заказов.

В этой статье разберем, как программно отследить обновление статуса заказа и по нему изменить статус товаров, входящих в этот заказ.

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

Типичные сценарии:

  • Товар ограниченной партии, при продаже которого нужно помечать его как "распродан".
  • Управление статусом товаров для маркетинговых целей — например, скрывать товар после первого заказа.
  • Автоматическая архивация товаров после завершения последнего заказа.

Если в магазине много таких товаров, ручное обновление неудобно, нужна автоматизация.

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

WooCommerce предоставляет хук woocommerce_order_status_changed, который срабатывает при смене статуса заказа. Используем его, чтобы получить заказ и список товаров из него.

add_action('woocommerce_order_status_changed', 'wpc_update_product_status_on_order_change', 10, 4); 
function wpc_update_product_status_on_order_change($order_id, $old_status, $new_status, $order) {
    // Ваш код обработки
}

Параметры:

  • $order_id — ID заказа;
  • $old_status и $new_status — старый и новый статусы заказа;
  • $order — объект WC_Order.

Пошаговое решение: изменить статус товаров при смене статуса заказа

Допустим, нам нужно переводить все товары заказа в статус "нет в наличии" (outofstock), если заказ сменился в статус "завершен" (completed).

  1. Подключаемся к хуку woocommerce_order_status_changed.
  2. Проверяем, что новый статус — completed.
  3. Получаем все товары из заказа.
  4. Для каждого товара обновляем статус запаса (stock_status) на outofstock.
add_action('woocommerce_order_status_changed', 'wpc_update_product_status_on_order_change', 10, 4);
function wpc_update_product_status_on_order_change($order_id, $old_status, $new_status, $order) {
    if ($new_status !== 'completed') {
        return; // Действуем только при переходе в completed
    }

    foreach ( $order->get_items() as $item ) {
        $product = $item->get_product();
        if ( ! $product ) {
            continue;
        }

        // Переводим товар в статус 'outofstock'
        $product->set_stock_status('outofstock');
        $product->save();
    }
}

Объяснение кода

Метод set_stock_status изменяет статус запаса товара, что влияет на отображение его доступности на сайте. Метод save сохраняет изменения в базе.

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

  1. Создайте тестовый заказ с несколькими товарами.
  2. Переведите заказ в статус "completed" через админку WooCommerce.
  3. Перейдите в карточку каждого товара и проверьте статус запаса (вкладка "Запас" или "Inventory"). Он должен быть outofstock.
  4. На фронтенде товары должны отображаться как недоступные для покупки.

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

  • Код не срабатывает при смене статуса: проверьте, что функция подключена в файле functions.php или в плагине, и что нет ошибок PHP.
  • Объект товара возвращается null: возможно, товар был удалён или заказ нестандартный. Добавьте проверку if (!$product) continue;.
  • Статус не меняется на фронтенде: убедитесь, что включено управление запасами у товара (WooCommerce → настройки → Товары → Запасы) и что кэш сайта сброшен.
  • Изменение статуса мешает другим процессам: если есть сторонние плагины управления запасами, они могут переопределять изменения. Проверьте совместимость.

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

  • Обязательно используйте проверку статуса, чтобы код не выполнялся лишний раз.
  • При большом количестве товаров в заказах учитывайте нагрузку на сервер — массовое обновление может замедлить работу.
  • Добавьте логирование для отладки, например, через error_log().
  • Резервное копирование перед внедрением изменений — всегда обязательный пункт.

Альтернативы: плагины или кастомный код

СпособПлюсыМинусы
Кастомный код (описанный выше)Максимальный контроль, без лишних зависимостей, бесплатныйНужно писать и тестировать самому, возможны ошибки без опыта
Плагины управления запасамиГотовые решения с настройками, поддержкаМогут быть платными, не всегда подходят под конкретные задачи

Для удобства управления WooCommerce и очистки дублирующихся записей можно рассмотреть плагины типа Clearfy Pro.

×
Прокачай свой сайт WordPress!

WordPress

-20% на премиум темы и плагины

Создай сайт своей мечты ⋙