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

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

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

Проверка:
Перейдите в WooCommerce → Заказы и отсортируйте заказы по статусу pending или failed. Обратите внимание на дату создания заказа. Если есть заказы старше 7 дней, которые не были оплачены, их имеет смысл удалять автоматически.

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

1. Создаем функцию удаления заказов старше заданного срока

function wpdemo_delete_expired_orders() {
    // Период в днях, по истечении которого заказы считаются просроченными
    $expiration_days = 7;
    $date = date('Y-m-d H:i:s', strtotime('-' . $expiration_days . ' days'));

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

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // Удаляем навсегда
    }
}

2. Регистрируем WP-Cron задачу для регулярного запуска

function wpdemo_schedule_expired_orders_deletion() {
    if (!wp_next_scheduled('wpdemo_delete_expired_orders_event')) {
        wp_schedule_event(time(), 'daily', 'wpdemo_delete_expired_orders_event');
    }
}
add_action('wp', 'wpdemo_schedule_expired_orders_deletion');

add_action('wpdemo_delete_expired_orders_event', 'wpdemo_delete_expired_orders');

3. Добавляем деактивацию задачи при отключении плагина или темы

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

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

  • Через wp-admin зайдите в WooCommerce → Заказы и убедитесь, что заказы со статусом pending или failed старше 7 дней удалены.
  • Посмотрите в базу данных таблицу wp_posts с типом shop_order, заказы старше 7 дней должны отсутствовать.
  • Для проверки запуска WP-Cron можно использовать плагин WP Crontrol, в нем должна появиться задача wpdemo_delete_expired_orders_event с ежедневным запуском.

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

  • Заказы не удаляются: проверьте, что функция wc_get_orders возвращает ID заказов. Включите отладку, добавьте error_log() внутри цикла для проверки. Убедитесь, что хук WP-Cron срабатывает (проверьте через WP Crontrol).
  • Удаляются не те заказы: проверьте параметры 'status' и 'date_created' в массиве аргументов. Используйте var_dump для вывода $orders перед удалением.
  • WP-Cron не запускается автоматически: На некоторых хостингах WP-Cron не срабатывает без внешних запросов. Настройте системный cron (crontab) или плагин для имитации запуска cron.

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

  • Удаление заказов происходит навсегда (wp_delete_post(..., true)), поэтому убедитесь, что вы не удаляете важные данные по ошибке.
  • Настройте период удаления разумно (например, 7 дней), чтобы не потерять данные по неоплаченным заказам, которые могут быть важны для аналитики.
  • Для больших магазинов с тысячами заказов лучше делать удаление пакетами, например по 50 заказов за раз, чтобы не перегружать сервер.
  • Используйте wp_schedule_event с периодом не чаще одного раза в день, чтобы минимизировать нагрузку.
  • Регулярно делайте резервные копии базы данных перед внедрением автоматического удаления.

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

СпособПлюсыМинусы
Код через WP-Cron (как в статье)Полный контроль, без сторонних плагинов, гибкость настройкиТребует базовых знаний PHP и cron, возможны ошибки при большом объеме данных
Плагин для очистки заказовПростота установки и настройкиМожет не соответствовать нуждам, лишний код, нагрузка
Ручное удаление через админкуПростота, без кодаТребуется время и внимание, риск пропуска заказов
Как отключить автовоспроизведение видео в блоках Gutenberg WordPress
11.02.2026
WooCommerce: автоматическое возвратное действие при отклонённом платеже
03.05.2026
Как установить ограничение на размер файлов при загрузке в WordPress
13.04.2026
Автоматическое удаление спама в комментариях WordPress: практические решения и примеры
18.12.2025
WooCommerce: как автоматизировать удаление просроченных заказов
26.05.2026