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

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

В стандартной настройке WooCommerce заказ, созданный пользователем, может оставаться в статусе "ожидает оплаты" (pending payment) неопределенно долго, если клиент не завершил оплату. Это приводит к "зависшим" заказам, которые засоряют базу и мешают аналитике, а также могут создавать проблемы при управлении складом или отчетностью.

Задача — автоматически переводить такие заказы в статус "отменен" (cancelled) или "отклонен" (failed) через заданный промежуток времени после создания, если оплата не была завершена.

Как определить заказы, которые нужно обновить

Нужно выбрать заказы с одним из следующих условий:

  • Статус заказа – pending (ожидает оплаты).
  • Дата создания заказа старше установленного лимита, например, 24 часа (86400 секунд).

Для этого можно использовать WP_Query с параметрами по статусу и дате post_date, либо напрямую запросить базу через $wpdb.

Пошаговое решение: автоматическое обновление статуса через WP-Cron

1. Создаем функцию, которая проверит и обновит заказы

function wpcoder_cancel_unpaid_orders() {
    $time_limit = 24 * 60 * 60; // 24 часа в секундах
    $args = array(
        'status' => 'pending',
        'date_created' => '<' . ( new WC_DateTime( '@' . ( time() - $time_limit ) ) )->format( 'Y-m-d H:i:s' ),
        'limit' => -1,
        'return' => 'ids',
    );
    $orders = wc_get_orders( $args );
    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( $order ) {
            $order->update_status( 'cancelled', 'Автоматическое отменение заказа из-за отсутствия оплаты в течение 24 часов.' );
        }
    }
}

2. Регистрируем WP-Cron задачу

add_action( 'wpcoder_daily_cancel_unpaid_orders', 'wpcoder_cancel_unpaid_orders' );

if ( ! wp_next_scheduled( 'wpcoder_daily_cancel_unpaid_orders' ) ) {
    wp_schedule_event( time(), 'daily', 'wpcoder_daily_cancel_unpaid_orders' );
}

3. Добавляем удаление задачи при деактивации плагина или темы

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

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

  • Создайте заказ в статусе pending.
  • Измените дату создания заказа в базе данных (для теста) на время более 24 часов назад или временно уменьшите $time_limit в функции.
  • Запустите вручную WP-Cron задачу, например через плагин WP Crontrol или вызовом do_action('wpcoder_daily_cancel_unpaid_orders');.
  • Проверьте, что статус заказа изменился на cancelled.

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

  • Задача WP-Cron не запускается автоматически: по умолчанию WP-Cron зависит от посещений сайта. Для надежной работы настройте системный cron (crontab) на вызов wget -q -O - https://example.com/wp-cron.php?doing_wp_cron или используйте плагин WP Crontrol для отладки.
  • Неверное время в запросе: будьте внимательны с форматированием даты в параметре date_created. Используйте класс WC_DateTime для правильного формата.
  • Проблемы с правами доступа: убедитесь, что скрипт запускается с правами, позволяющими обновлять заказы.

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

  • Запросы к заказам делайте с ограничением по количеству (limit), чтобы при большом объеме данных не было проблем с памятью.
  • Для сайтов с большим числом заказов рассмотрите разбиение обработки на несколько частей с помощью offset и batch size.
  • Логируйте автоматические изменения статусов, чтобы можно было отследить работу скрипта.
  • Регулярно очищайте устаревшие заказы, чтобы не перегружать базу.

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

Метод Плюсы Минусы Рекомендации
WP-Cron с wp_schedule_event Легко реализовать, встроено в WordPress Зависит от посещаемости сайта, может не сработать вовремя Настроить системный cron для надежности
Реальный системный cron + WP-CLI Максимальная надежность, точное время запуска Требует доступа к серверу и навыков администрирования Использовать для больших и критичных проектов
Плагины автоматизации (Clearfy Pro и др.) Упрощают настройку, имеют дополнительные функции Могут быть избыточными или платными Если нужно быстро и с дополнительными возможностями
Как использовать настройки пересылки электронной почты в WordPress
13.01.2026
Автоматическое удаление неиспользуемых метаполей в WordPress
22.03.2026
WooCommerce: автоматическое удаление неактивных пользователей с заказами
12.05.2026
Автоматический импорт товаров из CSV в WooCommerce: пошаговое руководство
31.03.2026
Как удалить или сбросить пароль в WordPress через базу данных MySQL
17.04.2026