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

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

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

Ручное удаление таких заказов неудобно и требует постоянного контроля. Оптимальным решением является автоматизация удаления на уровне сервера с помощью WP-Cron — встроенного планировщика задач WordPress.

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

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

Чаще всего под неактивными понимаются заказы в статусах:

  • pending — заказ создан, но оплата не начата;
  • failed — оплата не прошла;
  • cancelled — отменён пользователем.

Также важен возраст заказа — например, удалять только те, что старше 3 дней.

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

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

function wpfreecourses_delete_old_inactive_orders() {
    $days = 3; // количество дней для хранения заказа
    $statuses = array('pending', 'failed', 'cancelled');

    $args = array(
        'limit'        => -1,
        'status'       => $statuses,
        'date_created' => '<' . (new DateTime("-" . $days . " days"))->format('Y-m-d H:i:s'),
        'return'       => 'ids',
    );

    $orders = wc_get_orders($args);
    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}

3. Регистрируем WP-Cron задачу

Добавим задачу, которая будет запускать функцию ежедневно:

// Регистрируем событие при активации темы или плагина
function wpfreecourses_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpfreecourses_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpfreecourses_daily_order_cleanup');
    }
}
add_action('wp', 'wpfreecourses_schedule_order_cleanup');

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

// Очистка при деактивации (если плагин) или удалении темы
function wpfreecourses_clear_scheduled_order_cleanup() {
    $timestamp = wp_next_scheduled('wpfreecourses_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpfreecourses_daily_order_cleanup');
    }
}

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

  • Для теста можно временно изменить интервал в wp_schedule_event на 'hourly' и уменьшить количество дней в функции удаления до 0 (удалять все старше текущего момента).
  • Проверьте в админке WooCommerce — заказы с указанными статусами старше заданного срока должны пропадать.
  • Для отладки используйте логирование, например, добавьте error_log('Удалён заказ '.$order_id); в цикл удаления.
  • Убедитесь, что WP-Cron работает корректно — это можно проверить плагинами типа WP Crontrol.

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

  • WP-Cron не срабатывает: если сайт мало посещаем, WP-Cron может не запускаться. Решение — настроить системный cron на сервере, вызывающий wp-cron.php по расписанию.
  • Удаление заказов не происходит: проверьте, что статусы и дата создания заказов корректно передаются в wc_get_orders(). Используйте отладку и проверку результатов запроса.
  • Заказы удаляются слишком рано или поздно: проверьте правильность расчёта даты и параметр $days в функции удаления.
  • Удаляются нужные активные заказы: убедитесь, что список статусов ограничен только неактивными, чтобы не затронуть оплаченные и обработанные заказы.

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

  • Удаление заказов — операция необратимая с wp_delete_post(..., true). Резервное копирование базы обязательно.
  • Для крупных магазинов с тысячами заказов делайте удаление партиями, чтобы избежать превышения лимита памяти и времени выполнения скрипта.
  • Используйте WP-Cron только для задач с низкой частотой, для критичных процессов лучше системный cron.
  • Оптимизируйте запрос к заказам, не запрашивайте все данные, а только ID для удаления.

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

МетодПлюсыМинусыРекомендации
Ручное удаление в админке WooCommerceПростота, контрольТрудоёмко, риск пропускаПодходит для маленьких магазинов
WP-Cron с пользовательским кодом (как в статье)Автоматизация, гибкость, бесплатное решениеЗависит от WP-Cron, нужен минимальный опыт программированияОптимально для средних и крупных проектов
Плагины для очистки заказов (например, "Bulk Delete" или "WP Optimize")Готовое решение, интерфейсМожет быть избыточным, нагрузка на сайтИспользуйте при отсутствии возможности писать код
WooCommerce: автоматическое удаление неактивных заказов по расписанию
26.06.2026
WooCommerce: автоматическое обновление статуса заказа при оплате через платёжные системы
15.07.2026
Как разрешить доступ к файлам в WordPress через .htaccess: практические решения
21.11.2025
Как использовать PHPStan для анализа кода WordPress: практическое руководство
05.02.2026
Автоматическое удаление неактивных заказов в WooCommerce
22.05.2026