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

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

В WooCommerce статус pending или on-hold означает, что заказ создан, но оплата не подтверждена. Иногда заказы долго остаются в этом статусе из-за того, что покупатель не завершил оплату или произошел сбой с платежным шлюзом. Это приводит к захламлению базы данных, усложняет аналитику и мешает администрированию.

Типичные причины:

  • Пользователь не оплатил заказ и не отменил его
  • Технические сбои платежного плагина или API
  • Отсутствие автоматической очистки неактивных заказов

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

Решение — внедрить автоматическую смену статуса заказа через WP-Cron, которая будет проверять заказы со статусом pending или on-hold и переводить их в статус cancelled спустя заданный период (например, 24 часа).

Добавление планировщика задач для очистки просроченных заказов

Добавьте следующий код в functions.php вашей дочерней темы или в кастомный плагин:

<?php
// Регистрируем событие при активации плагина/темы
function wc_schedule_pending_order_cleanup() {
    if ( ! wp_next_scheduled( 'wc_pending_order_cleanup_hook' ) ) {
        wp_schedule_event( time(), 'hourly', 'wc_pending_order_cleanup_hook' );
    }
}
add_action( 'wp', 'wc_schedule_pending_order_cleanup' );

// Отменяем событие при деактивации
function wc_unschedule_pending_order_cleanup() {
    $timestamp = wp_next_scheduled( 'wc_pending_order_cleanup_hook' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wc_pending_order_cleanup_hook' );
    }
}
register_deactivation_hook( __FILE__, 'wc_unschedule_pending_order_cleanup' );

// Обработчик события
add_action( 'wc_pending_order_cleanup_hook', 'wc_cancel_pending_orders' );

function wc_cancel_pending_orders() {
    $args = array(
        'status' => array( 'pending', 'on-hold' ),
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ), // старше 24 часов
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( $order && ! in_array( $order->get_status(), array( 'completed', 'cancelled', 'refunded' ) ) ) {
            $order->update_status( 'cancelled', 'Автоматическая отмена: оплата не поступила в течение 24 часов.' );
        }
    }
}
?>

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

  1. Откройте файл functions.php вашей дочерней темы или создайте кастомный плагин.
  2. Вставьте приведённый выше код.
  3. Сохраните изменения и загрузите файл на сервер.
  4. Убедитесь, что WP-Cron работает корректно (например, используя плагин WP Crontrol).
  5. Подождите час или запустите WP-Cron вручную для теста.

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

  • Создайте тестовый заказ со статусом pending.
  • Установите дату создания заказа на более чем 24 часа назад (через базу данных или с помощью плагина для редактирования даты).
  • Запустите WP-Cron вручную (если используете WP Crontrol, найдите событие wc_pending_order_cleanup_hook и запустите).
  • Проверьте, что статус заказа изменился на cancelled и в истории заказа появилось соответствующее примечание.

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

  • WP-Cron не срабатывает: Убедитесь, что на сервере нет ограничений на выполнение PHP-скриптов, а также что сайт посещают пользователи (для штатного WP-Cron). Можно настроить системный cron для вызова wp-cron.php.
  • Заказы не меняют статус: Проверьте правильность статусов в запросе и наличие доступа к заказам. Для отладки добавьте error_log() внутри функции.
  • Проблемы с датой создания заказа: WooCommerce использует объект DateTime для даты, в аргументах wc_get_orders нужно использовать строку в формате ISO 8601, например date_created => '<2023-06-01T00:00:00'. В коде выше используется относительное время, убедитесь в корректности.

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

  • Не запускайте WP-Cron слишком часто — достаточно одного раза в час для таких задач.
  • Для большого магазина лучше использовать системный cron вместо штатного WP-Cron.
  • Добавляйте в логи информацию для мониторинга автоматических операций.
  • Перед обновлением WooCommerce тестируйте кастомный код на тестовом сервере.

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

МетодПлюсыМинусыПример кода/плагина
WP-Cron с кастомным кодомГибкость, полный контроль, бесплатноЗависимость от посещаемости сайта, сложность отладкиКод из статьи выше
Плагины автоматической очистки заказов (например, "WooCommerce Cancel Abandoned Order")Простая настройка, поддержка разработчиковДополнительная нагрузка, возможна платаClearfy Pro - частично решает задачи оптимизации
Как запустить WordPress без PHP: практическое руководство по Headless CMS
21.03.2026
Как добавить автоматический подпись в email, отправляемый из WordPress
12.04.2026
Как изменить размер изображений в WordPress без потери качества
05.04.2026
WooCommerce: решение проблемы, когда не отображаются способы оплаты при оформлении заказа
07.05.2026
Как добавить пользовательские роли в WordPress с поддержкой AJAX
18.12.2025

Ресурс в разработке, скоро здесь будет сайт по вордпресс