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

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

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

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

  • Множество заказов в статусе pending или on-hold старше нескольких дней;
  • Заказы не меняют статус автоматически, хотя оплата не поступила;
  • Ручное удаление заказов занимает много времени и неэффективно.

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

1. Создаем WP-CLI команду для поиска и удаления заказов

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

if ( defined('WP_CLI') && WP_CLI ) {
    WP_CLI::add_command('wc_cleanup_expired_orders', function($args, $assoc_args) {
        $status = isset($assoc_args['status']) ? $assoc_args['status'] : 'pending';
        $days = isset($assoc_args['days']) ? (int)$assoc_args['days'] : 7;
        $confirm = isset($assoc_args['confirm']) ? filter_var($assoc_args['confirm'], FILTER_VALIDATE_BOOLEAN) : false;

        $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

        $orders = wc_get_orders($args);

        if (empty($orders)) {
            WP_CLI::success("Нет заказов со статусом '{$status}' старше {$days} дней.");
            return;
        }

        WP_CLI::log("Найдено заказов для удаления: " . count($orders));

        if (!$confirm) {
            WP_CLI::warning("Для удаления добавьте параметр --confirm=true");
            return;
        }

        $deleted_count = 0;
        foreach ($orders as $order_id) {
            $order = wc_get_order($order_id);
            if ($order) {
                $order->delete(true);
                $deleted_count++;
            }
        }

        WP_CLI::success("Удалено заказов: {$deleted_count}");
    });
}

2. Запуск команды из терминала

Из корня сайта выполните:

wp wc_cleanup_expired_orders --status=pending --days=7 --confirm=true

Параметры:

  • --status — статус заказов для удаления (по умолчанию pending);
  • --days — удалять заказы старше указанного количества дней (по умолчанию 7);
  • --confirm — подтверждение удаления (обязательный параметр для запуска удаления).

3. Автоматизация с помощью WP-Cron

Чтобы запускать очистку автоматически, добавим задачу WP-Cron, вызывающую вышеописанную функцию без удаления (для проверки) и с удалением при необходимости.

add_action('wp_loaded', function() {
    if (!wp_next_scheduled('wc_cleanup_expired_orders_event')) {
        wp_schedule_event(time(), 'daily', 'wc_cleanup_expired_orders_event');
    }
});

add_action('wc_cleanup_expired_orders_event', function() {
    $days = 7;
    $status = 'pending';

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

    $orders = wc_get_orders($args);

    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            $order->delete(true);
        }
    }
});

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

  • Запустите WP-CLI команду без --confirm, чтобы увидеть, сколько заказов будет удалено.
  • Проверьте базу данных или список заказов в админке WooCommerce — заказы со статусом pending, старше указанного срока, должны исчезнуть после подтверждения удаления.
  • Настройте логирование в коде или плагине для контроля работы автоматического WP-Cron.
  • Проверьте, что автоматический Cron-запуск выполняется, просмотрев логи или с помощью плагина для мониторинга Cron задач.

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

  • Никакие заказы не удаляются при запуске команды: проверьте, что статус и количество дней заданы корректно, а заказы действительно существуют.
  • WP-CLI команда не зарегистрирована: убедитесь, что код с WP_CLI::add_command загружается в файле плагина или functions.php и что WP-CLI установлен и доступен.
  • Удаление не происходит без параметра --confirm: это сделано специально для безопасности, чтобы избежать случайных удалений.
  • WP-Cron не запускается: настройте системный cron для вызова wp-cron.php или используйте плагин для управления Cron задачами.

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

  • Всегда тестируйте удаление на тестовом сайте, чтобы избежать потери важных данных.
  • Добавьте резервное копирование базы данных перед массовым удалением заказов.
  • Ограничивайте количество удаляемых заказов за один запуск Cron, чтобы избежать таймаутов.
  • Для крупных магазинов рассмотрите реализацию пакетной обработки с пагинацией.
  • Используйте права доступа: запускать WP-CLI команду должны только администраторы сервера или сайта.

Сравнение способов реализации удаления просроченных заказов

МетодПлюсыМинусыРекомендуется для
WP-CLI команда Точный контроль, подтверждение удаления, нет нагрузки на фронтенд Требуется доступ к терминалу, не для новичков Администраторы и разработчики
WP-Cron задача Автоматизация, без участия человека Зависит от корректной работы Cron, может не работать на слабых хостингах Магазины с регулярной нагрузкой
Плагины очистки заказов Простота установки, интерфейс Меньший контроль, возможны конфликты Новички, малые магазины
WooCommerce: автоматическое удаление просроченных заказов с подтверждением
13.07.2026
Как создать динамичный виджет в WordPress с применением AJAX
28.01.2026
Как создать свой плагин WordPress — пошаговое руководство
04.11.2025
Как удалить или скрыть стартовую страницу WordPress без плагинов
09.03.2026
WooCommerce: автоматическое сброс статуса заказа при ошибках платежа
09.05.2026