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

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

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

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

Как понять, что проблема есть

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

Пошаговое решение: автоматическое отключение и отмена отложенных оплат

1. Добавление WP-Cron задачи для проверки просроченных заказов

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

<?php
// Регистрируем событие при активации темы или плагина
function wpa_schedule_cancel_unpaid_orders() {
    if ( ! wp_next_scheduled( 'wpa_cancel_unpaid_orders_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'wpa_cancel_unpaid_orders_hook' );
    }
}
register_activation_hook( __FILE__, 'wpa_schedule_cancel_unpaid_orders' );

// Убираем при деактивации
function wpa_unschedule_cancel_unpaid_orders() {
    wp_clear_scheduled_hook( 'wpa_cancel_unpaid_orders_hook' );
}
register_deactivation_hook( __FILE__, 'wpa_unschedule_cancel_unpaid_orders' );

2. Функция отмены просроченных заказов

Определим функцию, которая будет искать заказы со статусом pending или on-hold, старше заданного количества дней, и переводить их в статус cancelled.

function wpa_cancel_unpaid_orders() {
    $days_limit = 7; // Кол-во дней до отмены
    $date_limit = date( 'Y-m-d H:i:s', strtotime( "-{$days_limit} days" ) );

    $args = array(
        'limit'        => -1,
        'status'       => array('pending', 'on-hold'),
        'date_created' => '<' . $date_limit,
    );

    $orders = wc_get_orders( $args );

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

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

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

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

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

  • WP-Cron не запускается автоматически. Причина: на сайте низкий трафик или отключена функция WP-Cron. Решение: настроить системный cron на сервере для запуска wp-cron.php или использовать плагин WP Crontrol для ручного запуска.
  • Заказы не находятся по дате создания. Проверьте, что используете правильный формат даты и поле date_created поддерживает сравнение. В WooCommerce 3.0+ это работает корректно при использовании wc_get_orders.
  • Статусы заказов отличаются от ожидаемых. Убедитесь, что в вашем магазине именно статусы pending и on-hold используются для отложенной оплаты. Если есть кастомные статусы, добавьте их в массив 'status'.

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

  • Не ставьте слишком короткий период для отмены — 3-7 дней оптимально, чтобы не потерять клиентов.
  • При большом количестве заказов используйте пагинацию выборки или разбейте задачу на несколько частей, чтобы не перегружать сервер.
  • Логируйте автоматические действия в отдельный файл или системный журнал, чтобы отслеживать отмены.
  • Отключайте WP-Cron и настраивайте системный cron для стабильности на продакшене.

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

СпособПреимуществаНедостаткиКомпромисс
Плагин (например, WooCommerce Order Status Control) Готовое решение, UI для настройки Дополнительный плагин, нагрузка, зависимость Использовать на небольших сайтах
Самописный WP-Cron код (описанный выше) Легкий, без лишних плагинов, гибкий Нужно писать и тестировать самостоятельно Оптимально для разработчиков и кастомных проектов
Ручная отмена заказов из админки Просто, без кода Трудоемко, риск забыть Подходит для мелких магазинов с низким потоком заказов
Как добавить дополнительные мета-поля в административную панель WordPress
22.12.2025
Как создать собственный вид мета-блока в WordPress с примерами кода
13.03.2026
Как создать автоматическое удаление неиспользуемых картинок в WordPress
07.04.2026
Как удалить заблокированные пользователи из WordPress
09.12.2025
WooCommerce: как автоматически исключать товары из каталога при отсутствии на складе
20.05.2026