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

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

В WooCommerce по умолчанию статус заказа меняется автоматически в зависимости от платежного шлюза и его настроек. Однако в ряде случаев, например, при нестандартных методах оплаты или кастомных интеграциях, такого поведения нет — заказ остается в статусе "Ожидает оплаты" или "Обработка".

Проверьте следующие моменты:

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

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

1. Отслеживаем событие успешной оплаты

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

add_action('woocommerce_payment_complete', 'custom_change_order_status_after_payment', 10, 1);

2. Функция для смены статуса

Для смены статуса используйте метод $order->update_status(). Например, чтобы сменить статус на "завершен" после оплаты:

function custom_change_order_status_after_payment($order_id) {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    // Проверяем текущий статус, чтобы избежать повторной смены
    if ($order->get_status() === 'processing') {
        $order->update_status('completed', 'Автоматическая смена статуса после оплаты.');
    }
}

3. Добавляем проверку метода оплаты (по желанию)

Если нужно менять статус только для конкретного способа оплаты, добавьте условие:

if ($order->get_payment_method() !== 'cod') { // пример для оплаты при доставке
    return;
}

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

Создайте тестовый заказ с нужным способом оплаты, оплатите его в тестовом режиме и проверьте статус в админке WooCommerce:

  • Статус должен автоматически измениться на указанный (например, completed).
  • В истории заказа появится комментарий от системы с текстом из update_status.
  • Если статус не меняется, проверьте логи на наличие ошибок и активность хука.

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

  • Хук не срабатывает: возможно, используется нестандартный платежный шлюз, который не вызывает woocommerce_payment_complete. В этом случае нужно искать другой хук, например, в API шлюза.
  • Статус не меняется из-за неправильного статуса заказа: функция меняет статус только если текущий — processing. Если статус другой, добавьте дополнительные условия.
  • Проблемы с кэшированием: кэш плагинов или сервера может задерживать обновление. Очистите кэш и проверьте снова.

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

  • Добавляйте проверку прав доступа, если планируете расширять функционал смены статуса через пользовательские запросы.
  • Избегайте тяжелых операций внутри хуков оплаты — только смена статуса и основные действия, чтобы не замедлять процесс оформления заказа.
  • Для масштабных магазинов используйте журналирование изменений статуса для аудита и отладки.

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

СпособПлюсыМинусыКогда использовать
Хук woocommerce_payment_complete Простой, штатный, эффективно срабатывает Не работает с кастомными шлюзами без поддержки Для стандартных платежных методов WooCommerce
Кастомные хуки платежных шлюзов Гибкий, можно адаптировать под любой способ оплаты Требует изучения API каждого шлюза При использовании нестандартных способов оплаты
Периодический cron-запрос Не зависит от событий оплаты Задержка, нагрузка на сервер, не мгновенно Если нельзя отследить событие оплаты напрямую
WooCommerce: как автоматически удалять товары после первого заказа
25.05.2026
Как удалить или заблокировать плагин WordPress правильно
08.11.2025
Уникальные методы бэкапа базы данных WordPress в 2024 году
17.04.2026
Как использовать хуки для оптимизации WordPress: практические примеры и советы
08.12.2025
Как удалить категорию из URL в WordPress без плагинов
03.05.2026