WooCommerce: как автоматически отключить отложенные оплаты при превышении срока

Проблема: отложенные оплаты в WooCommerce не отключаются автоматически

В стандартной комплектации WooCommerce не предусматривает автоматического отключения отложенных оплат, если клиент не завершил оплату в установленный срок. Это может привести к накоплению неоплаченных заказов, которые занимают ресурсы и мешают корректному учету.

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

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

  • Существуют ли неоплаченные заказы со статусом on-hold или pending, которые не меняют статус длительное время.
  • Нет ли сторонних плагинов, которые должны были бы обрабатывать эти статусы.
  • Отсутствие настроек автоматического удаления или отмены таких заказов в WooCommerce или хостинге.

Для проверки выполните SQL-запрос к базе данных WordPress (через phpMyAdmin или WP-CLI):

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

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

Как автоматически отключать отложенные оплаты с помощью кода

Реализуем cron-задачу, которая будет проверять заказы в статусе pending или on-hold старше заданного времени (например, 24 часа) и менять их статус на cancelled.

Шаг 1. Добавление кастомного cron-события

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

Шаг 2. Создание функции отмены просроченных заказов

add_action('auto_cancel_delayed_payments', function() {
    $args = [
        'limit' => -1,
        'status' => ['pending', 'on-hold'],
        'date_created' => '<' . (time() - 24 * 3600), // старше 24 часов
    ];

    $orders = wc_get_orders($args);

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

Шаг 3. Очистка cron при деактивации темы или плагина

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

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

Чтобы проверить, что автоматическое отключение работает, создайте тестовый заказ с отложенной оплатой и установите дату создания заказа на более чем 24 часа назад (через базу данных или вручную изменив время тестового заказа).

Далее запустите cron вручную через WP-CLI:

wp cron event run auto_cancel_delayed_payments

После выполнения проверьте статус заказа в админке WooCommerce — он должен смениться на cancelled.

Частые ошибки и причины

  • Отсутствие cron-задачи: Если cron не запускается, проверьте, что на сайте не отключены WP-Cron или настроен системный cron. Можно добавить в wp-config.php define('DISABLE_WP_CRON', false); или настроить системный cron.
  • Некорректный фильтр даты: В параметре date_created нужно использовать корректный формат. В примере выше используется timestamp, который WooCommerce умеет интерпретировать.
  • Кэширование: Плагины кэширования могут мешать своевременному выполнению cron-задач, временно отключите их при отладке.

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

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

Сравнение подходов автоматического отключения отложенных оплат

МетодПреимуществаНедостатки
Плагин автоматизацииБыстрая установка, готовые настройкиЗависимость от стороннего кода, может нагружать сайт
Код в теме/плагине (как в статье)Контроль, лёгкая кастомизация, без лишних зависимостейТребует базовых знаний PHP и WooCommerce API
Ручное управление через админкуПростота, не требует программированияТрудозатратно, высок риск забыть отключить заказы
Как автоматически удалять нерабочие и устаревшие скрипты в WordPress для ускорения сайта
19.03.2026
Обработка AJAX запросов в WordPress с примерами кода
21.11.2025
Как удалить по умолчанию скрипты и стили в WooCommerce для ускорения сайта
10.05.2026
Как удалить избыточные виджеты в WordPress
17.04.2026
Как удалить неиспользуемые медиафайлы в WordPress
02.12.2025