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

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

В интернет-магазинах на WooCommerce часто возникает ситуация, когда клиенты начинают оформление заказа, но не завершают оплату. Такие неоплаченные заказы занимают ресурсы базы данных и могут создавать путаницу в отчетах. Автоматическое отключение (отмена) неоплаченных заказов через определенное время помогает поддерживать базу в актуальном состоянии и освобождает товары для повторной продажи.

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

1. Определяем срок ожидания оплаты

Обычно считают разумным период от 30 минут до 24 часов, в зависимости от специфики магазина.

2. Используем WP-Cron для регулярной проверки статуса заказов

WP-Cron позволяет запускать задачи по расписанию. Для автоматического отключения заказов создадим функцию, которая будет запускаться, например, каждые 15 минут.

function wc_cancel_unpaid_orders() {
    if ( ! class_exists('WooCommerce') ) {
        return;
    }

    $time_limit = 60 * 60; // 1 час в секундах
    $args = array(
        'status' => 'pending',
        'date_created' => '<' . ( time() - $time_limit ),
        'limit' => -1
    );

    $orders = wc_get_orders( $args );

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

// Регистрация события
add_action( 'wc_cancel_unpaid_orders_event', 'wc_cancel_unpaid_orders' );

// Создаем событие, если оно еще не запущено
if ( ! wp_next_scheduled( 'wc_cancel_unpaid_orders_event' ) ) {
    wp_schedule_event( time(), 'fifteen_minutes', 'wc_cancel_unpaid_orders_event' );
}

// Регистрируем интервал 15 минут
add_filter( 'cron_schedules', function( $schedules ) {
    $schedules['fifteen_minutes'] = array(
        'interval' => 900, // 900 секунд = 15 минут
        'display' => 'Каждые 15 минут'
    );
    return $schedules;
} );

3. Добавляем код в functions.php или создаем небольшой плагин

Рекомендуется для удобства и безопасности оформить код в отдельный плагин или использовать сниппет-плагин (например, Code Snippets), чтобы не потерять изменения при обновлении темы.

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

Чтобы убедиться, что автоматическое отключение работает:

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

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

  • Задача WP-Cron не запускается: по умолчанию WP-Cron запускается при посещении сайта, если трафика мало, задачи могут не выполняться вовремя. Для решения — настроить системный cron на сервере или использовать плагин WP Crontrol для отладки.
  • Неправильный формат даты в запросе заказов: date_created принимает объекты DateTime или строки в формате ISO 8601. В нашем коде лучше использовать date_created' => '<' . date('Y-m-d H:i:s', time() - $time_limit).
  • Отмена заказов не видна: убедитесь, что статус cancelled поддерживается вашей версией WooCommerce и не переопределяется другими плагинами.

Оптимизация и безопасность

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

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

МетодОписаниеПлюсыМинусы
WP-Cron и собственный кодРегулярная проверка заказов и смена статусаГибко, без дополнительных плагиновЗависит от активности сайта, требует тестирования
Плагины автоматизации заказовГотовые решения с настройками времени и уведомленийПростота настройки, поддержкаМожет нагружать сайт, ограниченная кастомизация
Внешние скрипты через cron сервераВызов WP REST API или wp-cli для отмены заказовНезависимость от WP-Cron, надежностьТребует доступа к серверу и навыков

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

  • Определить время ожидания оплаты
  • Добавить или проверить код с WP-Cron
  • Убедиться в правильности фильтра даты заказа
  • Настроить запуск WP-Cron или системного cron
  • Проверить работу на тестовых заказах
  • Добавить логирование и уведомления (по желанию)
  • Мониторить нагрузку и корректировать периодичность

Наш каталог плагинов WordPress