Что делать, если нужно менять статус товара при обновлении заказа в 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).
- Подключаемся к хуку
woocommerce_order_status_changed. - Проверяем, что новый статус —
completed. - Получаем все товары из заказа.
- Для каждого товара обновляем статус запаса (
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 сохраняет изменения в базе.
Проверка результата после внедрения
- Создайте тестовый заказ с несколькими товарами.
- Переведите заказ в статус "completed" через админку WooCommerce.
- Перейдите в карточку каждого товара и проверьте статус запаса (вкладка "Запас" или "Inventory"). Он должен быть
outofstock. - На фронтенде товары должны отображаться как недоступные для покупки.
Частые ошибки и как их исправить
- Код не срабатывает при смене статуса: проверьте, что функция подключена в файле
functions.phpили в плагине, и что нет ошибок PHP. - Объект товара возвращается
null: возможно, товар был удалён или заказ нестандартный. Добавьте проверкуif (!$product) continue;. - Статус не меняется на фронтенде: убедитесь, что включено управление запасами у товара (WooCommerce → настройки → Товары → Запасы) и что кэш сайта сброшен.
- Изменение статуса мешает другим процессам: если есть сторонние плагины управления запасами, они могут переопределять изменения. Проверьте совместимость.
Практические советы по безопасности и производительности
- Обязательно используйте проверку статуса, чтобы код не выполнялся лишний раз.
- При большом количестве товаров в заказах учитывайте нагрузку на сервер — массовое обновление может замедлить работу.
- Добавьте логирование для отладки, например, через
error_log(). - Резервное копирование перед внедрением изменений — всегда обязательный пункт.
Альтернативы: плагины или кастомный код
| Способ | Плюсы | Минусы |
|---|---|---|
| Кастомный код (описанный выше) | Максимальный контроль, без лишних зависимостей, бесплатный | Нужно писать и тестировать самому, возможны ошибки без опыта |
| Плагины управления запасами | Готовые решения с настройками, поддержка | Могут быть платными, не всегда подходят под конкретные задачи |
Для удобства управления WooCommerce и очистки дублирующихся записей можно рассмотреть плагины типа Clearfy Pro.