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

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

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

Как определить заказы для автоматической отмены

  • Заказы со статусом processing или on-hold;
  • Которые не были оплачены в течение X часов;
  • У которых нет подтверждения платежа по вебхукам или API платёжной системы.

Проверка статуса оплаты заказа

Для корректной работы нужно проверить метаданные заказа, например, наличие транзакции или подтверждения оплаты (_payment_completed, _transaction_id и т.п.).

Пошаговое решение: создание функции отмены заказов через CRON

Ниже пример кода, который отменяет неоплаченные заказы старше 6 часов со статусом processing или on-hold:

function wppay_cancel_unpaid_orders() {
    $hours = 6;
    $statuses = array('processing', 'on-hold');

    $args = array(
        'limit' => -1,
        'status' => $statuses,
        'date_created' => '<' . ( new WC_DateTime( "-{$hours} hours" ) )->format( 'Y-m-d H:i:s' ),
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        // Проверяем, есть ли подтверждение оплаты
        $payment_completed = $order->get_meta('_payment_completed');
        if ( ! $payment_completed ) {
            $order->update_status( 'cancelled', 'Автоматическая отмена: неоплачен более 6 часов' );
        }
    }
}

// Регистрируем CRON задачу при активации темы или плагина
function wppay_schedule_cron() {
    if ( ! wp_next_scheduled( 'wppay_cancel_unpaid_orders_hook' ) ) {
        wp_schedule_event( time(), 'hourly', 'wppay_cancel_unpaid_orders_hook' );
    }
}
add_action( 'wp', 'wppay_schedule_cron' );

add_action( 'wppay_cancel_unpaid_orders_hook', 'wppay_cancel_unpaid_orders' );

Объяснение кода

  • Получаем заказы со статусом processing и on-hold старше 6 часов;
  • Проверяем мета-ключ _payment_completed, который должен ставиться вашим платёжным плагином при успешном платеже;
  • Если оплаты нет, меняем статус заказа на cancelled с комментарием;
  • CRON запускается каждый час.

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

  1. Создайте тестовый заказ и не завершайте оплату;
  2. Убедитесь, что заказ попадает в статус processing или on-hold;
  3. Подождите 6 часов или измените условие времени в коде на 1 минуту для теста (например, -1 minute вместо -6 hours);
  4. Запустите CRON вручную через WP-CLI: wp cron event run wppay_cancel_unpaid_orders_hook;
  5. Проверьте, что статус заказа изменился на cancelled.

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

  • CRON-задача не запускается: убедитесь, что в WordPress включён WP-Cron, либо настройте системный CRON для вызова wp-cron.php;
  • Метаданные оплаты не выставляются: проверьте, что платёжный плагин корректно устанавливает мета-ключ _payment_completed или используйте другой уникальный признак успешной оплаты;
  • Не все заказы обрабатываются: убедитесь, что аргументы wc_get_orders корректны, и статусы совпадают с теми, которые реально используются в магазине;
  • Отмена заказа приводит к ошибкам: проверьте, что нет конфликтов с другими плагинами, которые могут блокировать смену статуса.

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

  • Не увеличивайте слишком часто частоту CRON-задачи — достаточно 1 раз в час, чтобы не нагружать базу;
  • Используйте индексы по дате создания заказа в базе данных для быстрого поиска;
  • Для больших магазинов используйте пагинацию в wc_get_orders с параметрами limit и offset для обработки заказов партиями;
  • Логируйте действия функции отмены заказов в отдельный файл для последующего аудита;
  • Проверяйте, чтобы платёжный плагин корректно обрабатывал отмену заказа и не оставлял за собой незавершённые транзакции.

Сравнение способов реализации автоматической отмены заказов

СпособОписаниеПлюсыМинусы
CRON-задание через wp_schedule_eventАвтоматический запуск функции отмены в WordPressПростота, интеграция с WPЗависит от WP-Cron, нагрузка на сайт при большом количестве заказов
Системный CRON + WP-CLIВызов скрипта через системные задачи сервераНадёжность, стабильностьТребует доступа к серверу, знания CLI
Плагин для управления заказамиГотовые решения с интерфейсомУдобство для пользователей без кодаМожет быть ресурсозатратным и дорогим
WooCommerce: как удалить зависшие платежи и избавиться от проблем в платежной системе
28.06.2026
Как создать настраиваемый платежный плагин для WordPress
26.01.2026
WooCommerce: автоматическая отмена незавершённых платежей
05.06.2026
WooCommerce: как настроить автоматическое отключение неактивных подписок по срокам
22.06.2026
WooCommerce: устранение проблемы отсутствия подтверждения платежа при оплате картой
25.05.2026