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

Диагностика проблемы неоплаченных заказов в WooCommerce

В интернет-магазинах на WooCommerce часто накапливаются неоплаченные заказы, которые занимают место в базе и могут влиять на статистику, отчёты и инвентарь. Особенно если магазин принимает разные способы оплаты, для которых статус неоплаченного заказа может отличаться (например, "on-hold", "pending", "failed"). Без автоматического контроля такие заказы остаются в системе неопределённо долго.

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

  • Рост количества неоплаченных заказов в админке WooCommerce.
  • Ручное удаление или отмена заказов занимает много времени.
  • Некорректные отчёты по выручке и запасам.

Как настроить автоматическую отмену неоплаченных заказов по статусам и срокам

Общий подход через WP-Cron и кастомный PHP-код

Реализуем задачу с помощью планировщика WP-Cron, который будет запускать проверку заказов с нужными статусами и датой создания, и автоматически менять их статус на "cancelled" после заданного срока.

Пример кода для functions.php или собственного плагина:

<?php
// Регистрируем задачу при активации темы/плагина
function wc_schedule_auto_cancel() {
    if ( ! wp_next_scheduled( 'wc_auto_cancel_unpaid_orders' ) ) {
        wp_schedule_event( time(), 'hourly', 'wc_auto_cancel_unpaid_orders' );
    }
}
add_action( 'wp', 'wc_schedule_auto_cancel' );

// Очищаем расписание при деактивации
function wc_clear_auto_cancel() {
    $timestamp = wp_next_scheduled( 'wc_auto_cancel_unpaid_orders' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wc_auto_cancel_unpaid_orders' );
    }
}
register_deactivation_hook( __FILE__, 'wc_clear_auto_cancel' );

// Обработчик события
add_action( 'wc_auto_cancel_unpaid_orders', 'wc_auto_cancel_orders_by_status_and_date' );

function wc_auto_cancel_orders_by_status_and_date() {
    $statuses = [
        'pending' => 24,   // отменять через 24 часа
        'on-hold' => 48,  // отменять через 48 часов
        'failed' => 72    // отменять через 72 часа
    ];

    foreach ( $statuses as $status => $hours ) {
        $date_limit = date( 'Y-m-d H:i:s', strtotime( "-{$hours} hours" ) );

        $args = [
            'limit'        => -1,
            'status'       => $status,
            'date_created' => '<' . $date_limit,
            'return'       => 'ids',
        ];

        $orders = wc_get_orders( $args );

        foreach ( $orders as $order_id ) {
            $order = wc_get_order( $order_id );
            // Дополнительная проверка, чтобы не отменять уже отменённые
            if ( $order->get_status() !== 'cancelled' ) {
                $order->update_status( 'cancelled', 'Автоматическая отмена заказа по истечении срока ожидания оплаты.' );
            }
        }
    }
}
?>

Пошаговая инструкция внедрения

  1. Добавьте приведённый код в functions.php вашей темы или создайте небольшой плагин.
  2. Зайдите в админку WordPress и выполните любое обновление страницы, чтобы запустить регистрацию cron-задачи.
  3. Убедитесь, что WP-Cron работает (например, добавьте тестовое событие или используйте плагин WP Crontrol).
  4. Отслеживайте логи WooCommerce на предмет записей об отмене заказов.

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

  • Создайте тестовый заказ с одним из статусов (например, "pending") и датой создания более 24 часов назад в базе данных (можно править напрямую через phpMyAdmin или использовать плагины для управления заказами).
  • Принудительно запустите WP-Cron (через WP Crontrol или вызов wp cron event run --due-now в WP-CLI).
  • Проверьте, изменился ли статус заказа на "cancelled" и добавилась ли запись в историю заказов с комментарием об автоматической отмене.

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

  • WP-Cron не запускается: Если сайт не получает трафик, встроенный WP-Cron не срабатывает. Решение — настроить системный cron на сервере для вызова wp-cron.php или использовать плагин для управления cron.
  • Заказы не отменяются: Проверьте правильность статусов, которые вы указываете в массиве $statuses, они должны совпадать с регистрацией статусов в WooCommerce.
  • Производительность падает на больших базах: Ограничьте количество обрабатываемых заказов за один запуск, добавьте пагинацию или увеличьте интервал запуска cron.
  • Ошибка прав доступа к заказам: Убедитесь, что код запускается с правами администратора или в контексте, где доступны функции WooCommerce.

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

  • Ограничьте права доступа к функции отмены заказов, чтобы её нельзя было запустить через публичные запросы.
  • Добавьте логирование в отдельный файл, чтобы отслеживать автоматические изменения, это поможет при аудите и отладке.
  • Если у вас высоконагруженный магазин, рассмотрите перенос логики в отдельный сервис или использование внешнего cron с WP-CLI.
  • Для удобства мониторинга используйте плагин WP Crontrol для управления и просмотра запланированных задач.

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

МетодПреимуществаНедостаткиКогда применять
Код в functions.php с WP-CronГибкость, кастомизация, не требует сторонних плагиновЗависит от WP-Cron, требует навыков PHPСредние и большие магазины с возможностью поддержки кода
Плагин автоматической отмены заказовПростота установки и настройкиМогут быть ограничены по функционалу, нагрузкаМалые магазины, отсутствие возможности писать код
Внешний скрипт или WP-CLIНадёжность, масштабируемость, контроль над запускомСложность настройки, требует серверного доступаКрупные проекты с высокими требованиями к производительности
WooCommerce: автоматическое изменение цены продукта при изменении количества в корзине
17.06.2026
Как удалить или отключить XML-RPC в WordPress: практические решения и примеры кода
09.01.2026
WooCommerce: автоматическое удаление неоплаченных заказов по разным статусам и срокам
10.06.2026
Как создать свою систему отзывов с подтверждением в WordPress
24.12.2025
Авторизация по одноразовому паролю (OTP) в WordPress с практическими решениями
16.01.2026