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

В чем суть проблемы с неоплаченными заказами в WooCommerce?

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

Для решения этой задачи требуется автоматическое отключение (отмена) заказов, которые не были оплачены в течение 24 часов после создания.

Диагностика: как определить, что заказы нужно отключать

  • Проверьте в админке WooCommerce список заказов со статусом on-hold или pending.
  • Посмотрите, сколько времени они находятся в этом статусе. Если более 24 часов — они кандидаты на автоматическую отмену.
  • Убедитесь, что ручная проверка и удаление заказов неудобны, и нужна автоматизация.

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

1. Добавляем крон-задачу в WordPress

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

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

2. Обрабатываем заказы в задании

Создаем функцию, которая найдет все неоплаченные заказы старше 24 часов и переведет их в статус cancelled.

add_action('wc_auto_cancel_unpaid_orders', 'wc_cancel_unpaid_orders_after_24h');
function wc_cancel_unpaid_orders_after_24h() {
    $args = array(
        'limit'        => -1,
        'status'       => array('pending', 'on-hold'),
        'date_created' => '<' . (time() - 24 * 60 * 60),
    );
    $orders = wc_get_orders($args);
    foreach ($orders as $order) {
        // Проверяем, что заказ действительно не оплачен
        if (!$order->is_paid()) {
            $order->update_status('cancelled', 'Автоматическое отключение из-за отсутствия оплаты более 24 часов');
        }
    }
}

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

register_deactivation_hook(__FILE__, function() {
  wp_clear_scheduled_hook('wc_auto_cancel_unpaid_orders');
});

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

  • Создайте тестовый заказ со статусом pending или on-hold.
  • Измените дату создания заказа в базе данных вручную на дату более 24 часов назад (через phpMyAdmin или WP CLI).
  • Запустите крон-задачу вручную (через WP CLI или временно добавьте вызов функции в код).
  • Проверьте, что статус заказа изменился на cancelled.
  • Отслеживайте логи и уведомления администратора при автоматическом изменении.

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

  • Задача не запускается автоматически: Проверьте, что WP Cron работает. На некоторых серверах cron отключен, тогда настройте системный cron на вызов wget -q -O - https://example.com/wp-cron.php?doing_wp_cron.
  • Заказы не находятся по дате создания: В функции wc_get_orders параметр date_created должен быть объектом DateTime или строкой в формате ISO8601, а не timestamp. Исправьте так:
    $date = new DateTime();
    $date->modify('-24 hours');
    $args['date_created'] = '<' . $date->format('Y-m-d H:i:s');
  • Статус не меняется: Убедитесь, что у вас есть права доступа и что статус cancelled поддерживается WooCommerce. Если статус кастомный, зарегайте его.

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

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

Сравнение вариантов реализации автоматического отключения заказов

МетодПлюсыМинусы
Плагин (например, WooCommerce Order Status Manager + автоматизация)Готовое решение, интерфейс для настроекМожет быть платным, лишние функции
Кастомный код с WP CronТочный контроль, легкий, без лишних функцийТребует навыков программирования, нужно контролировать запуск cron
Внешний системный cron + WP CLIНадежный запуск, не зависит от посещений сайтаДополнительная настройка сервера
Как сделать автоматический редирект в WordPress по условиям
04.03.2026
Как автоматически удалять неиспользуемые метаполя в WordPress
31.03.2026
Как автоматизировать работу с изображениями в WordPress
25.11.2025
Как добавить собственный тип постов в WordPress
13.11.2025
WooCommerce: как избежать проблем с редкой оплатой и автоматическим отключением заказов
27.04.2026