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

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

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

Основные признаки проблемы:

  • В панели заказов множество статусных заказов "ожидает оплаты" или кастомных статусов, связанных с отложенной оплатой;
  • Неоплаченные заказы не удаляются автоматически спустя установленное время;
  • Ручное управление заказами требует много времени и приводит к ошибкам;
  • Влияние на производительность базы данных из-за большого количества старых заказов.

Как автоматически отключать заказы при отложенной оплате в WooCommerce

Обзор задачи

Цель — настроить автоматическое изменение статуса заказов, которые находятся в статусе "отложенная оплата" (Pending Payment или кастомный статус), и отключать их (например, переводить в статус "Отменён") после заданного времени ожидания (24, 48 часов и т.п.).

Реализация через WP-Cron, чтобы не нагружать сервер и избежать постоянных ручных проверок.

Пошаговое решение с примерами кода

1. Добавьте в файл functions.php вашей темы или в кастомный плагин следующий код для регистрации WP-Cron задачи:

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

2. Напишите функцию-обработчик, которая будет находить неоплаченные заказы старше заданного времени и менять их статус:

add_action( 'wplike_cleanup_pending_orders', 'wplike_auto_cancel_pending_orders' );
function wplike_auto_cancel_pending_orders() {
    $hours_to_wait = 48; // Время ожидания в часах
    $cutoff = strtotime( "-{$hours_to_wait} hours" );

    $args = array(
        'status' => array('pending', 'on-hold'), // Основные статусы отложенной оплаты
        'date_created' => '<' . date( 'Y-m-d H:i:s', $cutoff ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        $order = wc_get_order( $order_id );
        if ( ! $order ) continue;

        // Дополнительная проверка, чтобы не отменять оплаченные
        if ( $order->get_total() > 0 && ! $order->is_paid() ) {
            $order->update_status( 'cancelled', 'Автоматическая отмена заказа по причине отсутствия оплаты в течение 48 часов.' );
        }
    }
}

3. Очистите расписание WP-Cron при деактивации плагина или изменении кода:

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

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

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

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

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

  • WP-Cron не запускается: На некоторых хостингах WP-Cron не работает без посещения сайта. Решение — настроить системный cron на сервере для вызова wp-cron.php или использовать плагины для управления cron.
  • Функция отмены заказов не вызывается: Проверьте правильность хука wplike_cleanup_pending_orders и регистрацию события. Убедитесь, что код подключен и активен.
  • Заказы не меняют статус: Убедитесь, что статусы в фильтре 'status' => array('pending','on-hold') соответствуют вашим статусам отложенной оплаты. Возможно, у вас кастомные статусы — добавьте их.
  • Отмена заказов происходит слишком рано или слишком поздно: Проверьте значение переменной $hours_to_wait и корректность вычисления времени.

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

  • Используйте limit => -1 с осторожностью — на больших магазинах этот запрос может быть ресурсоемким. Лучше обрабатывать заказы порциями через пагинацию.
  • Добавьте логирование действий для отслеживания, какие заказы были отменены автоматически.
  • Не удаляйте заказы без необходимости — лучше изменять статус на "отменён" для сохранения истории.
  • Если используете кастомные способы оплаты с уникальными статусами, расширьте список статусов в запросе.

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

ВариантОписаниеПреимуществаНедостатки
WP-Cron с кастомным кодомРегулярная проверка и обновление статусов через PHPГибкость, контроль, не требует сторонних плагиновЗависит от работы WP-Cron, требует настройки
Плагины автоматизации заказовГотовые решения с настройкамиУдобство, поддержка, UIМожет нагружать сайт, дополнительные зависимости
Внешние скрипты через cron на сервереЗапуск скриптов вне WordPressНезависимость от WP-Cron, высокая надежностьСложность настройки, безопасность
WooCommerce: автоматическое изменение статуса заказа после получения почты покупателя
01.07.2026
WooCommerce: как добавить дополнительные поля в заказ без плагинов
30.04.2026
Автоматическое удаление неактивных пользователей WordPress
25.01.2026
Как отключить плагины в WordPress при проблемах с сайтом
17.03.2026
WooCommerce: как автоматически обновлять статус заказа при возврате платежа
30.05.2026