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

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

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

Типичные признаки проблемы:

  • Большое количество заказов со статусом pending или on-hold спустя несколько дней после создания;
  • Отсутствие перехода в статус processing или completed;
  • Отсутствие уведомлений об оплате от платежных систем;

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

Цель — автоматически менять статус заказов, которые не были оплачены в течение определенного времени, например 24 часа, на статус cancelled. Это позволяет очистить список активных заказов и улучшить управление магазином.

1. Добавление планировщика задач WP-Cron

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

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

function wpdemo_deactivate_order_cleanup_cron() {
    $timestamp = wp_next_scheduled( 'wpdemo_check_unpaid_orders' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpdemo_check_unpaid_orders' );
    }
}
register_deactivation_hook( __FILE__, 'wpdemo_deactivate_order_cleanup_cron' );

2. Функция обработки заказов

Основная функция будет находить заказы со статусом pending и датой создания старше 24 часов, меняя их статус на cancelled.

add_action( 'wpdemo_check_unpaid_orders', 'wpdemo_cancel_unpaid_orders' );

function wpdemo_cancel_unpaid_orders() {
    $args = array(
        'limit'        => -1,
        'status'       => 'pending',
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
    );

    $orders = wc_get_orders( $args );

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

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

Чтобы убедиться, что система работает:

  1. Создайте тестовый заказ и не завершайте оплату.
  2. Подождите 1 час (или измените интервал cron для ускоренного теста).
  3. Проверьте статус заказа в админке WooCommerce — он должен измениться на cancelled.
  4. Проверьте логи WooCommerce или используйте плагин Debug Bar для контроля вызова хука.

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

  • Планировщик WP-Cron не срабатывает: на некоторых хостингах WP-Cron зависит от посещений сайта. Для надежной работы настройте системный cron, либо активируйте плагин WP Crontrol для отладки.
  • Неверный параметр даты в запросе заказов: WooCommerce требует формат даты в ISO 8601 для date_created. В примере выше используется метка времени Unix, что вызовет ошибку. Правильный код для даты:
$date = new DateTime();
$date->modify('-24 hours');
$args['date_created'] = '<' . $date->format('Y-m-d H:i:s');
  • Заказы не меняют статус: проверьте права пользователя, под которым запускается код, и убедитесь, что нет конфликтов с другими плагинами, блокирующими изменение статуса.

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

  • Не выполняйте запрос на поиск большого количества заказов без ограничения — при большом объеме данных используйте пагинацию или batch-обработку.
  • Логируйте изменения статусов в отдельный файл или в системный лог, чтобы отслеживать работу скрипта.
  • Ограничьте доступ к коду только для администратора сайта, чтобы предотвратить несанкционированные изменения.

Чек-лист внедрения автоматического изменения статуса заказа

  1. Добавлен и активирован WP-Cron с регулярным запуском задачи.
  2. Реализована функция, меняющая статус заказов со статусом pending старше 24 часов.
  3. Проверено правильное форматирование даты для запроса заказов.
  4. Проверена работоспособность на тестовых заказах.
  5. Проведена отладка WP-Cron на хостинге (проверка через WP Crontrol или системный cron).
  6. Внедрена базовая логика для отслеживания изменений в статусах заказов.

Сравнение вариантов реализации: плагин vs кастомный код

Вариант Плюсы Минусы Когда использовать
Готовый плагин (например, "WooCommerce Order Status Manager") Быстрая установка, готовый UI, поддержка разных статусов Может быть избыточным, нагрузка, ограниченная кастомизация Для магазинов без разработчиков, быстрый старт
Кастомный код (как в статье) Легкий, точечный, полное управление логикой, минимальная нагрузка Требует навыков разработки и поддержки Для опытных разработчиков, специфические бизнес-правила
WooCommerce: автоматическое отключение товаров при отсутствии на складе с возможностью возврата
07.06.2026
WooCommerce: автоматическое изменение цены товара при расширенном дисконте
06.05.2026
WooCommerce: автоматическое сброс статуса заказа при ошибках платежа
09.05.2026
Как удалить переходы по ссылкам в WordPress без плагинов
19.03.2026
Как настроить автозаполнение форм в WordPress с помощью AJAX
16.04.2026