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

Проблема: статус заказа не меняется при отмене платежа

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

Диагностика проблемы

  • Проверьте, какие статусы заказов присутствуют в вашем магазине (WooCommerce > Настройки > Заказы).
  • Определите, какие статусы используются платежным шлюзом при отмене или отклонении платежа.
  • Убедитесь, что в настройках платежного шлюза не отключено автоматическое обновление статуса.
  • Просмотрите журнал событий WooCommerce или логи плагинов платежей на предмет ошибок обновления статуса.

Пошаговое решение

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

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

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

add_action('woocommerce_order_status_failed', 'auto_change_status_on_payment_cancelled', 10, 1);
function auto_change_status_on_payment_cancelled( $order_id ) {
    if ( ! $order_id ) {
        return;
    }
    $order = wc_get_order( $order_id );
    // Проверяем текущий статус
    if ( $order->get_status() === 'failed' ) {
        // Меняем статус на "отменён"
        $order->update_status( 'cancelled', 'Статус изменён автоматически: платеж отменён' );
    }
}

В этом примере при переходе заказа в статус failed (неудачный платеж) статус автоматически меняется на cancelled (отменён). Можно адаптировать логику под конкретные статусы и сценарии.

3. Добавляем поддержку нестандартных платежных шлюзов

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

add_action('your_gateway_payment_cancelled_hook', function( $order_id ) {
    $order = wc_get_order( $order_id );
    if ( $order ) {
        $order->update_status( 'cancelled', 'Платёж отменён через шлюз' );
    }
});

Как проверить, что решение работает

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

Частые ошибки и способы их исправления

  • Статус не меняется: проверьте, правильно ли указан статус в update_status() и существует ли он в WooCommerce.
  • Обработчик не срабатывает: убедитесь, что хук подключён в файле functions.php или в плагине и что при отмене платежа вызывается нужный хуковый триггер.
  • Конфликты с другими плагинами: отключите временно сторонние плагины, которые могут перезаписывать статусы заказов.
  • Отсутствие уведомлений клиенту: добавьте отправку email с помощью wc_mail() или стандартных функций WooCommerce после смены статуса.

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

  • Используйте проверку прав доступа и защиту от повторного вызова функций, чтобы избежать дублирования обновлений.
  • Логируйте изменение статусов в отдельный файл или систему логов для отладки и аудита.
  • Оптимизируйте код, избегая лишних запросов к базе данных, например, не вызывайте wc_get_order() без необходимости.
  • Если используете сторонние плагины для оплаты, изучите их API для более корректной интеграции.

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

ВариантПлюсыМинусы
Обработка стандартного хука woocommerce_order_status_failed Просто, работает с большинством платежей Не всегда соответствует сценарию отмены платежа
Использование callback-ов конкретного шлюза Точное управление статусами в зависимости от события Зависит от документации и кода шлюза
Плагин для автоматизации статусов Не требует кодинга, быстрый запуск Может быть избыточным и влиять на производительность
Как удалить заблокированные сессии пользователей в WordPress через код
11.03.2026
Решение проблемы неработающего AJAX в WordPress
16.02.2026
Как удалить заблокированные аккаунты пользователей в WordPress
02.01.2026
Как отключить системные email-уведомления WordPress без плагинов
07.04.2026
Как установить и настроить OmniVideo в WordPress
27.01.2026