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

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

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

Причины такой проблемы:

  • Отсутствие корректной обработки ошибок от платежного шлюза;
  • Проблемы с возвратом статуса платежа через API;
  • Конфликты плагинов, изменяющих логику заказа;
  • Отсутствие дополнительных проверок таймаутов для неоплаченных заказов.

Как настроить автоматическое изменение статуса заказа при проблемах с оплатой

Рассмотрим практическое решение через добавление кода в functions.php вашей темы или в отдельный плагин. Цель — по истечении определенного времени менять статус заказа с "в ожидании оплаты" на "отменен" или "отклонен", если оплата так и не прошла.

Шаг 1: Добавить WP-Cron задачу для проверки статусов

Добавим функцию, которая будет запускаться регулярно и проверять заказы в статусе "pending" или "on-hold" старше определенного времени.

function wpkpi_schedule_check_failed_payments() {
    if ( ! wp_next_scheduled( 'wpkpi_check_failed_orders_hook' ) ) {
        wp_schedule_event( time(), 'hourly', 'wpkpi_check_failed_orders_hook' );
    }
}
add_action( 'wp', 'wpkpi_schedule_check_failed_payments' );

add_action( 'wpkpi_check_failed_orders_hook', 'wpkpi_process_failed_orders' );

function wpkpi_process_failed_orders() {
    $args = array(
        'limit'        => -1,
        'status'       => array( 'pending', 'on-hold' ),
        'date_created' => '<' . ( time() - 60 * 60 * 24 ), // 24 часа назад
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        $order->update_status( 'cancelled', 'Автоматическая отмена заказа по причине неоплаты более 24 часов' );
    }
}

В этом коде мы проверяем заказы старше 24 часов и меняем их статус на "отменен". По желанию, можно изменить период или статус, на который меняется заказ.

Шаг 2: Обработка ошибок от платежного шлюза

Если вы используете популярные платежные шлюзы (например, WooCommerce Stripe, PayPal), убедитесь, что они корректно вызывают хуки при ошибках. Можно подписаться на событие <gateway>_payment_failed для дополнительной обработки.

add_action( 'woocommerce_payment_failed', 'wpkpi_handle_payment_failure', 10, 2 );
function wpkpi_handle_payment_failure( $order_id, $payment_method ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) {
        return;
    }
    // Меняем статус на отменённый с комментарием
    $order->update_status( 'cancelled', 'Оплата не прошла через ' . $payment_method );
}

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

После добавления кода и развертывания на сайте:

  • Создайте тестовый заказ и не оплачивайте его, дождитесь 24 часов (можно временно уменьшить время в коде для теста);
  • Убедитесь, что статус заказа поменялся на "отменен";
  • Проверьте логи WooCommerce и комментарии к заказу, чтобы убедиться, что причина изменения статуса отображается;
  • Попробуйте сымитировать отказ платежа и проверьте срабатывание хука woocommerce_payment_failed.

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

  • WP-Cron не запускается автоматически. Проверьте, что на сервере нет ограничений на запуск PHP скриптов, или настройте настоящий системный cron для вызова wp-cron.php. Без этого задача не будет выполняться.
  • Заказы не меняют статус. Убедитесь, что функции обновления статуса вызываются с корректными объектами заказа, что нет конфликтов с другими плагинами, блокирующими изменение статуса.
  • Платежные шлюзы не вызывают нужные хуки. Проверьте документацию платежного шлюза, возможно, потребуется использовать специфичные для него хуки или фильтры.
  • Изменение статуса влияет на уведомления клиенту. Если уведомления отправляются автоматически, настройте их шаблоны или отключите, чтобы не рассылать лишние письма.

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

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

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

ВариантПлюсыМинусы
WP-Cron + проверка датыПростой, не требует сторонних плагинов, гибкийЗависит от WP-Cron, возможны задержки
Хук платежного шлюзаМоментальная реакция на ошибкуЗависит от корректной реализации шлюза, не покрывает все случаи
Плагин автоматизации (например, Clearfy Pro)Готовые решения, визуальная настройкаПлатные, ограниченный контроль кода
WooCommerce: автоматическое удаление заказов по истечении срока
04.06.2026
Как создать динамическую картинку из метаданных поста WordPress
19.12.2025
Как добавить динамические фильтры в WordPress на примере категорий и метаполей
18.03.2026
WooCommerce: автоматическое удаление заказов по истечении срока
14.05.2026
WooCommerce: как настроить отложенный возврат и отмену заказа через хуки
21.04.2026