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

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

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

Как определить, какие заказы считать просроченными

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

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

1. Создание функции удаления заказов

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

function wpdemo_delete_expired_orders() {
    $days = 7; // количество дней, после которых заказ считается просроченным
    $statuses = array('pending', 'failed', 'on-hold');

    $args = array(
        'status' => $statuses,
        'date_modified' => '<' . ( new WC_DateTime() )->modify("-{$days} days")->date('Y-m-d H:i:s'),
        '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_cleanup() {
    if (! wp_next_scheduled('wpdemo_daily_expired_orders_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpdemo_daily_expired_orders_cleanup');
    }
}
add_action('wp', 'wpdemo_schedule_expired_orders_cleanup');

add_action('wpdemo_daily_expired_orders_cleanup', 'wpdemo_delete_expired_orders');

3. Очистка расписания при деактивации плагина или темы

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

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

  • В админке WooCommerce перейдите в «Заказы» и отфильтруйте заказы по статусам pending, failed, on-hold.
  • Обратите внимание на дату изменения заказа — заказы старше 7 дней должны быть удалены после срабатывания крон-задачи.
  • Для немедленной проверки вызовите функцию wpdemo_delete_expired_orders() вручную в тестовой среде или через WP-CLI: wp eval 'wpdemo_delete_expired_orders();'.

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

  • Крон-задача не запускается: Проверьте, работает ли WP-Cron на сайте. Для этого можно временно вызвать wp-cron.php вручную или настроить системный cron на сервере.
  • Заказы не удаляются: Убедитесь, что в запросе wc_get_orders правильно указаны параметры date_modified и status. Также проверьте права на удаление постов.
  • Удаляются оплаченные заказы: Проверьте, что в массиве $statuses нет статусов оплаченных заказов (processing, completed).

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

  • Удаление заказов — необратимая операция. Рекомендуется сначала делать резервные копии базы данных.
  • Для больших магазинов с тысячами заказов используйте пакетную обработку по 50-100 заказов за раз, чтобы избежать превышения лимита памяти или таймаута.
  • Для критичных сайтов лучше запускать WP-Cron через системный cron, чтобы обеспечить регулярность выполнения.
  • Рассмотрите возможность использования плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpdemo.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-prosrochennyh-zakazov) для оптимизации базы данных и управления задачами cron.

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

МетодПлюсыМинусыРекомендуемое применение
Ручное удаление через админкуПросто, не требует кодаТрудоёмко, неавтоматичноМалые магазины, редкие случаи
WP-Cron с кастомной функциейАвтоматизация, гибкостьЗависит от работы WP-Cron, требует базовых навыков PHPСредние и крупные магазины
Плагины для очистки базыУдобный интерфейс, дополнительные функцииМогут влиять на производительность, платные опцииДля комплексной оптимизации
Как использовать WPRemark для автоматического ответа на комментарии WordPress
08.02.2026
WooCommerce: автоматическое изменение статуса заказа при отсутствии платежа
14.05.2026
Как удалить или изменить URL типа записи в WordPress без пересоздания
09.01.2026
Как сделать автоматический отзыв на комментарии в WordPress
10.04.2026
Как избежать конфликтов между плагинами в WordPress
15.02.2026