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

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

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

Ручное удаление неудобно и требует постоянного контроля. Лучшим решением будет автоматизация процесса с помощью планировщика заданий WordPress — wp_cron.

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

1. Определяем критерии удаления заказов

В большинстве случаев удаляют заказы со статусом cancelled, failed или pending, которые старше определённого количества дней (например, 30).

2. Создаём функцию удаления заказов

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

function wc_delete_expired_orders() {
    $days = 30; // Кол-во дней, после которых заказы считаются просроченными
    $statuses = array('cancelled', 'failed', 'pending');
    
    $date_before = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'limit' => -1,
        'status' => $statuses,
        'date_created' => '<' . $date_before,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            // Удаляем заказ без возможности восстановления
            wp_delete_post($order_id, true);
        }
    }
}

3. Регистрируем задачу в wp_cron

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

function wc_schedule_expired_orders_deletion() {
    if (!wp_next_scheduled('wc_delete_expired_orders_hook')) {
        // Запускаем раз в сутки
        wp_schedule_event(time(), 'daily', 'wc_delete_expired_orders_hook');
    }
}
add_action('wp', 'wc_schedule_expired_orders_deletion');

add_action('wc_delete_expired_orders_hook', 'wc_delete_expired_orders');

4. Удаляем задачу при деактивации плагина или темы

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

function wc_clear_expired_orders_deletion_schedule() {
    $timestamp = wp_next_scheduled('wc_delete_expired_orders_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_delete_expired_orders_hook');
    }
}
// Пример для плагина
register_deactivation_hook(__FILE__, 'wc_clear_expired_orders_deletion_schedule');

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

  • Запустите функцию вручную, вставив вызов wc_delete_expired_orders(); в код или через WP-CLI, чтобы проверить удаление.
  • Проверьте, что заказы с нужными статусами и датой создания старше 30 дней действительно удаляются из базы.
  • Для проверки работы wp_cron можно использовать плагин WP Crontrol или wp-cli команду wp cron event list.
  • Убедитесь, что задача wc_delete_expired_orders_hook есть в списке и запускается раз в сутки.

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

  • Заказы не удаляются: проверьте, что функция вызывается и статусы заказов указаны правильно. Используйте error_log() внутри функции для отладки.
  • Задача wp_cron не запускается: проверьте, что на сайте посещения есть, так как wp_cron зависит от них. Для сервера с низкой посещаемостью настройте системный cron для запуска wp-cron.php.
  • Удаляются не те заказы: уточните параметры запроса, например статус, дату. Можно вывести ID удаляемых заказов в лог для контроля.
  • Проблемы с производительностью при большом количестве заказов: разбивайте удаление на партии с помощью параметров limit и смещения.

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

  • Всегда делайте резервную копию базы перед внедрением автоматического удаления.
  • Сохраняйте логи удалений для контроля и возможности восстановления информации при необходимости.
  • Используйте транзакции, если база данных поддерживает, или проверяйте целостность данных после удаления.
  • Для крупных магазинов разумно запускать удаление в ночное время, минимизируя нагрузку на сервер.
  • Если хотите ускорить удаление, можно использовать прямые SQL-запросы, но с осторожностью и проверкой совместимости с WooCommerce.

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

МетодПреимуществаНедостаткиКомпромисс
Ручное удаление через админкуПростота, нет кодаТрудозатратно, риск пропускаПодходит для малых сайтов
Плагин автоматизацииУдобство, интерфейсДополнительная нагрузка, зависимостиИспользуйте проверенные плагины
Код с wp_cron (описанный)Гибкость, контроль, без сторонних плагиновТребует навыков, возможны ошибкиЛучший выбор для разработчиков
Как создать собственный шорткод в WordPress
06.11.2025
Как удалить неиспользуемые шорткоды в WordPress для оптимизации сайта
14.02.2026
WooCommerce: как автоматически удалять просроченные заказы
16.05.2026
Решение проблемы: не работает визуальный редактор Gutenberg в WordPress
08.12.2025
Как добавить автоматическое сохранение в визуальном редакторе Gutenberg WordPress
05.03.2026