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

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

Часто при автоматическом изменении статуса заказа через код заказ остаётся с прежним статусом. Причины обычно следующие:

  • Использование неправильного хука для смены статуса.
  • Отсутствие вызова метода обновления заказа после изменения статуса.
  • Проблемы с правами пользователя при попытке изменения статуса.
  • Конфликты с другими плагинами, которые перезаписывают статус.

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

Как программно изменить статус заказа через хуки WooCommerce

Оптимальный способ — использовать хук woocommerce_order_status_changed для реакции на изменение статуса, а для программного изменения — метод $order->update_status().

Пример: автоматическое изменение статуса после оплаты

add_action('woocommerce_payment_complete', 'wpteam_change_order_status_after_payment');
function wpteam_change_order_status_after_payment($order_id) {
    if (!$order_id) return;
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Устанавливаем статус "обработка"
    $order->update_status('processing', 'Статус изменён автоматически после оплаты');
}

Этот код меняет статус на "processing" после того, как оплата была успешно завершена.

Другой пример: смена статуса по условию в админке

add_action('save_post_shop_order', 'wpteam_custom_order_status_change', 20, 1);
function wpteam_custom_order_status_change($post_id) {
    $order = wc_get_order($post_id);
    if (!$order) return;

    // Проверяем, если заказ в статусе "on-hold" и сумма больше 1000
    if ($order->get_status() === 'on-hold' && $order->get_total() > 1000) {
        $order->update_status('processing', 'Автоматический перевод заказа с on-hold на processing');
    }
}

Пошаговое решение

  1. Определите, в какой момент нужно менять статус (после оплаты, при изменении метаданных и т.п.).
  2. Выберите правильный хук — например, woocommerce_payment_complete или save_post_shop_order.
  3. Получите объект заказа через wc_get_order($order_id).
  4. Вызовите метод update_status() с нужным статусом и комментарием.
  5. Проверьте, что код не вызывается без условий и не приводит к циклам.

Как проверить, что статус изменился

  • Просмотрите заказ в админке WooCommerce — статус должен обновиться.
  • Добавьте логирование в ваш код с помощью error_log() или плагина Debug Bar.
  • Используйте SQL-запрос к базе (таблица wp_posts, поле post_status для заказов) для проверки статуса.

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

  • Статус не меняется: Возможно, вы не используете update_status(), а пытаетесь напрямую менять поле. Используйте методы WooCommerce.
  • Циклический вызов: Изменение статуса внутри хука, который вызывается при изменении статуса, может вызвать бесконечный цикл. Добавляйте проверки и условия.
  • Неверный ID заказа: При получении заказа по ID убедитесь, что ID валидный и заказ существует.
  • Проблемы с правами: Если вы меняете статус из фронтенда, убедитесь, что пользователь имеет права на это.

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

  • Не меняйте статус слишком часто в циклах — это нагружает базу.
  • Проверяйте, что изменение статуса действительно нужно (если статус уже нужный, не вызывайте update_status).
  • Используйте nonce и проверки прав для фронтенд-изменений.
  • Логируйте только ошибки или критические события, чтобы не засорять логи.

Сравнение способов изменения статуса заказов WooCommerce

СпособПлюсыМинусыПример
update_status() внутри хуков WooCommerceЧёткий контроль, поддерживается ядром WooCommerceМожно вызвать цикл, если не соблюдать осторожность$order->update_status('completed');
Прямое изменение post_status в БДБыстро, обходится без PHPНе рекомендуется, может сломать логику и кэшSQL-запрос UPDATE wp_posts
Использование плагинов для автоматизацииПростота для новичковМеньший контроль, возможные конфликтыНапример, AutomateWoo
WooCommerce: автоматическое создание заказа при оплате во внешней платежной системе
31.05.2026
Как удалить или скрыть страницы от индексации поисковыми системами в WordPress
28.03.2026
WooCommerce: автоматическое возврат средств при отмене заказа через код
13.05.2026
Как создать динамические поля в регистрации WordPress с помощью хуков
12.04.2026
WooCommerce: автоматическое отключение платежных методов при отказанном заказе
07.06.2026