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

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

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

Проверьте, что в вашем магазине есть неоплаченные заказы с статусом pending или on-hold, которые висят более 24 часов. Для этого:

  1. Перейдите в WooCommerce → Заказы.
  2. Отфильтруйте заказы по статусу Ожидает оплаты или В ожидании.
  3. Посмотрите дату создания заказов — если есть старые, которые не оплачены, задача актуальна.

Пошаговое решение: автоматическое отключение заказов через wp-cron

1. Создаём функцию для отмены неоплаченных заказов

Добавьте следующий код в файл functions.php вашей темы или в собственный плагин:

function wc_auto_cancel_unpaid_orders() {
    $args = array(
        'status' => array('pending', 'on-hold'),
        'date_created' => '<' . ( new WC_DateTime( '-24 hours' ) )->format( 'Y-m-d H:i:s' ),
        'limit' => -1,
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        if ( ! $order->has_status( 'cancelled' ) ) {
            $order->update_status( 'cancelled', 'Автоматическое отключение заказа из-за отсутствия оплаты более 24 часов.' );
        }
    }
}

2. Регистрируем событие wp-cron для запуска функции

Добавьте хук для периодического выполнения:

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

add_action( 'wc_auto_cancel_unpaid_orders_event', 'wc_auto_cancel_unpaid_orders' );

3. Отмена события при деактивации темы или плагина

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

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

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

  • Создайте тестовый заказ с оплатой, установленной в статус pending.
  • Измените дату создания заказа в базе данных, чтобы она была старше 24 часов, или подождите час, если хотите тестировать по-настоящему.
  • Запустите вручную функцию из консоли или временно вызовите её в functions.php (например, через AJAX или wp-cli).
  • Проверьте, сменился ли статус заказа на cancelled.
  • Убедитесь, что в админке WooCommerce в комментариях к заказу появился системный комментарий об отмене.

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

  • Заказы не отменяются: Убедитесь, что wp-cron работает на сервере. Для этого можно вызвать вручную wp cron event run --due-now через wp-cli.
  • Дублирование событий: Проверяйте, чтобы хук планировщика создавался только один раз, иначе функция будет запускаться несколько раз в час и нагружать сервер.
  • Статусы заказов: Проверьте, что вы указали правильные статусы в фильтре (pending, on-hold), иначе нужные заказы не попадут под отмену.
  • Проблемы с временной зоной: Используйте класс WC_DateTime для корректной работы с датами в WooCommerce.

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

  • Не запускайте функцию слишком часто — оптимально раз в час, чтобы не создавать лишнюю нагрузку.
  • Для магазинов с большим количеством заказов используйте пагинацию ('limit' => 100 и смещение), чтобы избежать таймаута.
  • Ограничьте права пользователя, под которым запускается wp-cron, чтобы исключить возможность злоупотреблений.
  • Для дополнительной безопасности можно логировать отменённые заказы в отдельную таблицу или файл для аудита.

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

МетодОписаниеПлюсыМинусы
Код с wp-cron Самописное решение с регулярным запуском функции отмены Гибкость, нет зависимостей от плагинов, легко кастомизируется Зависимость от корректной работы wp-cron, нужен базовый PHP-кодинг
Плагины типа "Auto Cancel Orders" Готовые решения с настройками в админке Простая установка, настройка без кода Могут создавать нагрузку, ограниченная кастомизация, лишний плагин
Ручная очистка через админку Отмена заказов вручную через интерфейс WooCommerce Простота без кода Трудозатратно, не подходит для больших магазинов
Как установить ограничение на регистрацию в WordPress по домену email
12.03.2026
Как создать собственный Post Type в WordPress
26.11.2025
Как использовать метод WPEXPERTS_get_terms для динамической загрузки категорий в WordPress
07.01.2026
Как создать выставку новостей с AJAX в WordPress
22.01.2026
Как использовать хуки для удаления CSS и JS в WordPress
08.12.2025