WooCommerce: автоматическое изменение статуса заказа по успешному платежу

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

В WooCommerce стандартная логика изменения статуса заказа зависит от используемого платежного шлюза. Иногда бывает, что после успешной оплаты заказ остается в статусе "Ожидает оплату" или "Обработка", что мешает дальнейшей обработке и уведомлению клиента. Это особенно критично, если платежный шлюз не отправляет корректный webhook или callback, либо интеграция реализована нестандартно.

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

  • Настройки платежного шлюза в WooCommerce — установлен ли корректный статус по умолчанию после успешного платежа;
  • Наличие webhook или callback URL, который платежный шлюз должен вызвать;
  • Логи WooCommerce и сервера на предмет ошибок при обновлении статуса;
  • Статус заказа в админке WooCommerce сразу после оплаты;
  • Конфликты с плагинами, которые могут блокировать смену статуса.

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

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

add_action('woocommerce_payment_complete', 'custom_update_order_status_after_payment');
function custom_update_order_status_after_payment($order_id) {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    // Проверяем, что заказ существует и статус еще не 'completed'
    if ($order && $order->get_status() !== 'completed') {
        // Устанавливаем статус 'completed'
        $order->update_status('completed', 'Статус изменен автоматически после успешного платежа');
    }
}

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

Обработка webhook платежного шлюза

Для шлюзов, которые отправляют webhook, нужно создать endpoint в WordPress и на него подписаться в настройках шлюза.

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/payment-webhook', array(
        'methods' => 'POST',
        'callback' => 'handle_payment_webhook',
        'permission_callback' => '__return_true',
    ));
});

function handle_payment_webhook(WP_REST_Request $request) {
    $data = $request->get_json_params();
    // Проверяем данные и статус платежа
    if (isset($data['order_id']) && isset($data['payment_status']) && $data['payment_status'] === 'success') {
        $order = wc_get_order($data['order_id']);
        if ($order && $order->get_status() !== 'completed') {
            $order->update_status('completed', 'Статус изменен через webhook платежного шлюза');
            return new WP_REST_Response('Статус обновлен', 200);
        }
    }
    return new WP_REST_Response('Ошибка данных', 400);
}

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

Чтобы проверить, что автоматическое изменение статуса работает:

  • Создайте тестовый заказ в WooCommerce с выбранным платежным методом;
  • Проведите оплату (в тестовом режиме или реальном, в зависимости от настроек);
  • Зайдите в админку WooCommerce и проверьте, что статус заказа изменился на completed или нужный вам статус;
  • Если настроен webhook — проверьте логи сервера и ответ вашего endpoint;
  • Проверьте, что уведомления клиенту и администратору отправляются корректно (если настроены).

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

  • Хук woocommerce_payment_complete не срабатывает: используемый платежный шлюз не вызывает стандартные хуки WooCommerce. В этом случае реализуйте обработку webhook вручную, как показано выше.
  • Статус заказа не меняется: проверьте права пользователя, под которыми выполняется скрипт, и ошибки в логах PHP. Иногда другие плагины могут перекрывать обновление статуса.
  • Webhook не доходит или возвращает ошибку 403: проверьте настройки .htaccess, файрволлы и разрешения REST API в WordPress.
  • Статус меняется, но уведомления не отправляются: убедитесь, что в настройках WooCommerce включены email-уведомления на нужные статусы.

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

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

Сравнение вариантов решения

МетодПлюсыМинусыКогда использовать
Хук woocommerce_payment_completeПростота внедрения, стандартный механизм WooCommerceРаботает не со всеми шлюзамиЕсли платежный шлюз поддерживает стандартные хуки WooCommerce
Обработка webhook вручную через REST APIГибкость, поддержка любых шлюзовТребует дополнительной настройки и проверки безопасностиЕсли шлюз не вызывает стандартные хуки, есть webhook
Использование сторонних плагинов для интеграцииМинимум кода, готовые решенияМожет быть избыточно, нагрузка, зависимость от обновленийДля популярных платежных систем с готовыми плагинами
Как сделать автоматический редирект в WordPress по условиям
14.04.2026
Как сделать автоматический редирект в WordPress по условиям
04.03.2026
Как добавить автоматический отзыв на посты WordPress
16.02.2026
WooCommerce: как автоматически отключать заказы при отмене платежа
04.05.2026
Как создать динамические формы в WordPress с помощью AJAX
31.03.2026