WooCommerce: автоматическое отключение оплаты при неподтверждённом заказе с помощью WP-Cron

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

В WooCommerce часто встречается ситуация, когда покупатель создаёт заказ, но не завершает оплату. Такие «зависшие» заказы занимают ресурсы базы данных и могут влиять на отчётность и складской учёт. По умолчанию WooCommerce удаляет такие заказы только через 60 дней, что зачастую слишком долго.

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

  • Статус заказа: pending или on-hold — значит заказ создан, но оплата не подтверждена.
  • Дата создания заказа — чтобы определить, сколько времени он висит без оплаты.
  • Оплаченный ли заказ — статус оплаты в WooCommerce обычно меняется на processing или completed после успешной оплаты.

Как проверить статус неподтверждённых заказов в базе данных

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND (post_status = 'wc-pending' OR post_status = 'wc-on-hold') ORDER BY post_date ASC;

Этот запрос покажет список заказов, которые в ожидании оплаты.

Пошаговое решение: отключение оплаты и отмена неподтверждённых заказов с помощью WP-Cron

Задача — автоматически менять статус неподтверждённых заказов после определённого времени (например, 1 час), чтобы заблокировать оплату и уведомить администратора.

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

function wc_auto_cancel_unpaid_orders() {
    $time_limit = strtotime('-1 hour');
    $args = array(
        'limit'        => -1,
        'status'       => array('pending', 'on-hold'),
        'date_created' => '<' . date('Y-m-d H:i:s', $time_limit),
    );
    $orders = wc_get_orders($args);

    foreach ($orders as $order) {
        // Меняем статус на отменённый
        $order->update_status('cancelled', 'Заказ автоматически отменён из-за неоплаты более 1 часа.');

        // Можно добавить уведомление админу
        wp_mail(get_option('admin_email'), 'Отменён неподтверждённый заказ #' . $order->get_id(), 'Заказ отменён автоматически системой из-за отсутствия оплаты.');
    }
}

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

add_action('wc_auto_cancel_unpaid_orders_hook', 'wc_auto_cancel_unpaid_orders');

if (!wp_next_scheduled('wc_auto_cancel_unpaid_orders_hook')) {
    wp_schedule_event(time(), 'hourly', 'wc_auto_cancel_unpaid_orders_hook');
}

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

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

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

  • Через час после создания новых заказов со статусом pending или on-hold проверить, что они автоматически меняются на cancelled.
  • Проверить почту администратора на получение уведомлений об отменённых заказах.
  • В админке WooCommerce в разделе Заказы убедиться, что неподтверждённые заказы исчезают из списка активных.

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

  • WP-Cron не запускается: На локальном сервере или при низкой посещаемости сайта WP-Cron может не срабатывать. Рекомендуется настроить системный cron на сервере или вызвать событие вручную.
  • Неправильный статус заказа: Если заказ уже оплачен или находится в статусе, отличном от pending и on-hold, он не будет обработан. Проверьте правильность указания статусов в фильтре.
  • Письма не отправляются: Проверьте настройки SMTP на сайте, используйте плагины типа WP Mail SMTP для отладки.

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

  • Для больших магазинов с тысячами заказов оптимизируйте выборку заказов, добавляя пагинацию, чтобы не перегрузить память.
  • Используйте nonce и проверку прав, если планируете расширять функционал с взаимодействием пользователя.
  • Для уведомлений используйте очереди или интеграцию с внешними сервисами (например, SMTP с очередями), чтобы избежать блокировки при массовой рассылке.

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

МетодПлюсыМинусыПодходит для
WP-Cron PHP скрипт (как в статье)Гибко, без плагинов, полный контрольЗависит от посещаемости сайта, настройка системы нужна для надёжностиСредние и крупные магазины с техническими навыками
Плагины управления заказами (например, WooCommerce Order Status Manager)Простота настройки, интерфейсМогут быть платными, ограниченный контрольМалые магазины без разработчиков
Внешние сервисы (через API WooCommerce)Отдельный контроль, масштабируемостьСложность интеграции, затраты на сервисКрупные проекты, интеграции с CRM
Как создать автоматический импорт визиток в WordPress
24.01.2026
Как автоматизировать управление проектами в WordPress с помощью WPTasks и Clearfy
30.03.2026
Автоматическое создание и управление задачами в WordPress с помощью WPTasks
06.03.2026
Как создать автоматический импорт данных из JSON в WordPress
14.04.2026
WooCommerce: автоматическое удаление неподтверждённых заказов
12.07.2026