WooCommerce: как изменить статус заказа по своему условию программно

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

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

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

Использование хука для изменения статуса

Для изменения статуса заказа по условию можно использовать хук woocommerce_order_status_changed или написать функцию, которая проверяет условие и меняет статус вручную через метод $order->update_status().

Пример кода, который меняет статус на "completed" если сумма заказа больше 10000 рублей:

add_action('woocommerce_order_status_processing', 'wpmax_change_order_status_if_condition', 10, 1);
function wpmax_change_order_status_if_condition($order_id) {
    if (!$order_id) return;

    $order = wc_get_order($order_id);
    if (!$order) return;

    // Условие: сумма больше 10000
    if ($order->get_total() > 10000) {
        $order->update_status('completed', 'Статус изменён автоматически по сумме заказа.');
    }
}

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

Если у вас есть внешняя проверка (например, API стороннего сервиса), то можно вызвать изменение статуса из своей функции:

function wpmax_custom_check_and_update_status($order_id) {
    $order = wc_get_order($order_id);
    if (!$order) return;

    // Пример проверки через API
    $check_result = wpmax_external_api_check($order_id);

    if ($check_result === true) {
        $order->update_status('completed', 'Заказ подтверждён внешней проверкой.');
    } elseif ($check_result === false) {
        $order->update_status('cancelled', 'Заказ отменён по результатам проверки.');
    }
}

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

  1. Определите событие или условие, при котором хотите менять статус (например, смена статуса на processing, получение webhook, кастомное действие).
  2. Напишите функцию, которая по $order_id получает объект заказа через wc_get_order().
  3. Реализуйте проверку вашего условия (сумма, статус оплаты, внешний API и т.д.).
  4. Вызовите $order->update_status('new_status', 'Комментарий к изменению'); чтобы поменять статус.
  5. Подключите функцию к подходящему хуку, например woocommerce_order_status_processing или вызывайте вручную.

Как проверить, что всё работает

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

Частые ошибки при программном изменении статуса заказа

  • Изменение статуса вне контекста заказа: вызов update_status без правильного объекта $order приведёт к ошибкам.
  • Циклические изменения: изменение статуса внутри хука, который вызывается при изменении статуса, может привести к бесконечным циклам.
  • Игнорирование проверки условий: меняйте статус только если условие действительно выполнено, иначе можно испортить логику заказов.
  • Необработанные исключения у внешних API: всегда обрабатывайте ошибки и таймауты при вызове внешних сервисов.

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

  • Не используйте изменение статуса в хуках, которые вызываются слишком часто, чтобы избежать нагрузки.
  • Проверяйте права пользователя, если изменение статуса инициируется из пользовательского интерфейса.
  • Логируйте изменения статусов для аудита и отладки.
  • Ограничьте вызов внешних API, чтобы не блокировать процесс обработки заказа.

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

СпособПлюсыМинусы
Хук WooCommerce (например, woocommerce_order_status_processing)Автоматизация, встроенный механизм, прост в подключенииРиск циклов, ограничен событиями WooCommerce
Вызов update_status() вручную при кастомном событииГибкость, можно вызывать в любой моментНеобходимо контролировать вызов и условия
Использование сторонних плагинов автоматизацииМеньше кода, готовые решенияЗависимость от плагина, возможные конфликты
Как создать автоматический импорт пользовательских регистраций в WordPress
16.04.2026
Как удалить версию WordPress из HTML и REST API для повышения безопасности
26.12.2025
Как избежать конфликтов между WooCommerce и кастомными плагинами в WordPress
23.04.2026
WooCommerce: как исключить товар из каталога и поиска без удаления
01.06.2026
Как создать динамический виджет в WordPress с AJAX загрузкой контента
11.03.2026