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

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

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

Основные причины проблемы:

  • Платёжный шлюз не отправляет корректный webhook или callback для подтверждения оплаты;
  • Не настроены или некорректно прописаны хуки для смены статуса;
  • Кастомный метод оплаты не вызывает необходимые функции WooCommerce для обновления статуса;
  • Конфликты с другими плагинами, которые блокируют смену статуса.

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

1. Определяем правильный хук для обработки оплаты

Если вы используете стандартные платежные шлюзы, можно использовать хук woocommerce_payment_complete, который вызывается при завершении оплаты.

2. Добавляем код для смены статуса

Пример кода, который переводит заказ в статус "обработка" после подтверждения оплаты:

add_action('woocommerce_payment_complete', 'custom_change_order_status_after_payment');
function custom_change_order_status_after_payment($order_id) {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    if ($order && 'pending' === $order->get_status()) {
        $order->update_status('processing', 'Статус изменён автоматически после оплаты.');
    }
}

3. Обработка кастомных платежных методов

Если используется свой метод оплаты, убедитесь, что в методе вызывается $order->payment_complete(); после успешной оплаты, это вызовет вышеописанный хук.

4. Альтернативный хук для подтверждения оплаты с webhook

Если платёжный шлюз отправляет webhook, нужно подключить обработчик и вручную менять статус. Например:

add_action('init', 'custom_webhook_listener');
function custom_webhook_listener() {
    if (isset($_GET['custom_payment']) && $_GET['custom_payment'] === 'success') {
        $order_id = intval($_GET['order_id']);
        $order = wc_get_order($order_id);
        if ($order && $order->has_status('pending')) {
            $order->update_status('processing', 'Оплата подтверждена через webhook.');
        }
        wp_die('OK');
    }
}

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

  • Создайте тестовый заказ с выбранным методом оплаты;
  • Совершите оплату через выбранный шлюз;
  • Проверьте, что в админке WooCommerce статус заказа изменился с pending на processing или нужный вам;
  • Проверьте логи на предмет ошибок, используйте error_log или WP_DEBUG для отладки.

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

  • Хук не вызывается: Проверьте, что платежный шлюз действительно вызывает woocommerce_payment_complete или вызывается $order->payment_complete() в кастомном методе.
  • Неверный статус заказа: Убедитесь, что вы не пытаетесь сменить статус на тот же, что уже установлен — WooCommerce игнорирует такие обновления.
  • Конфликты с другими плагинами: Отключите временно все плагины, кроме WooCommerce и вашего кода, чтобы исключить конфликт.
  • Неправильный ID заказа: При обработке webhook убедитесь, что передаёте корректный и существующий order_id.

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

  • При работе с webhook проверяйте подпись или токен от платежного шлюза, чтобы исключить подделку запросов.
  • Не используйте init без условий для больших проверок — фильтруйте запросы, чтобы код выполнялся только при необходимости.
  • Для логирования используйте отдельные файлы логов, не загромождайте основной лог WordPress.
  • Кэширование и оптимизация не влияют на смену статуса, но избегайте кеширования страниц админки и API-запросов.

Сравнение вариантов реализации

МетодКодИспользование плагиновКомпромиссы
Хук woocommerce_payment_complete Короткий, простой, встроенный в WooCommerce Не требуется Работает только с поддерживаемыми шлюзами
Обработка webhook вручную Требует дополнительного кода и проверки безопасности Не требуется Больше контроля, но сложнее в реализации
Плагины для смены статуса Минимум кода, но добавляет нагрузку Требуется Может конфликтовать, не всегда оптимально
Как создать автоматические уведомления в WordPress по событиям
27.03.2026
Как запустить WordPress в контейнере Docker с настройкой Nginx
08.04.2026
Как создать настройку в календаре для отображения событий в WordPress
15.01.2026
Как удалить автоматические ревизии в WordPress для ускорения сайта
19.03.2026
Как запретить отображение отзывов по категории в WordPress
16.03.2026