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

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

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

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

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

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

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

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

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

    // Проверяем текущий статус, чтобы не менять статус у уже завершенных заказов
    if ($order->get_status() !== 'completed') {
        $order->update_status('completed', 'Статус изменен программно после оплаты');
    }
}

Этот код нужно добавить в файл functions.php вашей темы или в кастомный плагин.

Особенности работы с разными платежными шлюзами

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

Обработка webhook для изменения статуса заказа

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

Пример простого обработчика webhook:

add_action('init', 'custom_webhook_listener');

function custom_webhook_listener() {
    if (!isset($_GET['custom_webhook']) || $_GET['custom_webhook'] !== 'payment_status') {
        return;
    }

    // Получаем данные из POST запроса
    $payload = file_get_contents('php://input');
    $data = json_decode($payload, true);

    if (empty($data['order_id']) || empty($data['payment_status'])) {
        status_header(400);
        echo 'Invalid data';
        exit;
    }

    $order_id = intval($data['order_id']);
    $payment_status = sanitize_text_field($data['payment_status']);

    $order = wc_get_order($order_id);
    if (!$order) {
        status_header(404);
        echo 'Order not found';
        exit;
    }

    if ($payment_status === 'paid') {
        $order->update_status('completed', 'Статус изменен через webhook');
        status_header(200);
        echo 'Status updated';
    } else {
        status_header(200);
        echo 'No action taken';
    }
    exit;
}

Для вызова обработчика в платежном сервисе укажите URL вида: https://example.com/?custom_webhook=payment_status.

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

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

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

  • Не срабатывает хук woocommerce_payment_complete: убедитесь, что платежный шлюз поддерживает этот хук. Иногда нужно использовать другие хуки, например, woocommerce_order_status_changed.
  • Webhook не вызывается: проверьте, что URL webhook корректен и доступен извне, нет блокировок firewall или плагинов безопасности.
  • Ошибка в JSON данных webhook: используйте валидатор JSON и убедитесь, что данные соответствуют ожидаемому формату.
  • Статус заказа не меняется из-за конфликтов плагинов: временно отключите плагины, связанные с заказами, и проверьте повторно.

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

  • Добавьте проверку подписи webhook (например, секретного ключа) для защиты от подделки запросов.
  • Используйте nonce или другую защиту для URL обработчика webhook.
  • Логируйте все изменения статусов и входящие webhook-запросы для последующего аудита.
  • Если у вас много заказов, избегайте тяжелых операций в хуках, чтобы не замедлять сайт.
  • Используйте транзакции и проверяйте, что статус меняется только один раз.

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

МетодПлюсыМинусыПример использования
Хук woocommerce_payment_completeПростота, встроенный в WooCommerce, легко реализоватьНе всегда срабатывает с нестандартными шлюзамиПример кода выше
Обработка webhook платежного сервисаГибкость, подходит для любых шлюзовТребует дополнительной настройки webhook и безопасностиПример обработчика webhook выше
Плагин для интеграции с платежной системойГотовые решения, поддержка обновленийМожет быть тяжеловесным, не всегда бесплатнымЗависит от плагина
Как удалить редиректы в WordPress: практическое руководство с примерами кода
01.03.2026
WooCommerce: установка и настройка ограничений на варианты товаров
23.04.2026
Как отключить автообновления в WordPress
04.01.2026
Как сделать автоподсказку в поиске WordPress
25.02.2026
Как отключить отправку писем WordPress без удаления плагинов
10.02.2026