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

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

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

Если не очищать такие заказы, база данных WooCommerce разрастается, увеличивается время выборок, и админка может тормозить.

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

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

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

function wc_delete_inactive_orders() {
    // Устанавливаем дату порога — заказы старше 30 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

    // Получаем заказы с нужными статусами
    $args = array(
        'limit' => -1,
        'status' => array('pending', 'failed', 'on-hold'),
        'date_created' => '<' . $date_threshold,
        'return' => 'ids',
    );
    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_trash_post($order_id); // Отправляем заказ в корзину
    }
}

2. Регистрируем событие WP-Cron

Добавьте код для планирования задачи, если она ещё не зарегистрирована:

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

// Привязываем нашу функцию к событию
add_action('wc_delete_inactive_orders_event', 'wc_delete_inactive_orders');

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

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

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

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

  • В админке WooCommerce перейдите в «Заказы» и отфильтруйте по статусам pending, failed, on-hold. Заказы старше 30 дней должны отсутствовать или быть перемещены в корзину.
  • Запустите вручную событие WP-Cron с помощью плагина WP Crontrol или WP-CLI:
    wp cron event run wc_delete_inactive_orders_event
  • Проверьте таблицу wp_posts в базе данных — заказы должны иметь статус trash и не мешать работе.

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

  • Заказы не удаляются: Проверьте, активна ли задача WP-Cron. По умолчанию WP-Cron запускается только при посещении сайта. Для надежности настройте системный cron на сервере, чтобы вызывать wp cron event run --due-now регулярно.
  • Удаляются неправильные заказы: Проверьте фильтр по дате и статусам в функции wc_delete_inactive_orders.
  • Повторяющееся удаление одних и тех же заказов: Используйте wp_trash_post(), а не wp_delete_post() сразу — заказы отправляются в корзину и не удаляются окончательно мгновенно, что безопаснее.
  • Планировщик WP-Cron не запускается: Убедитесь, что хук add_action('wc_delete_inactive_orders_event', 'wc_delete_inactive_orders') корректно подключен.

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

  • Не используйте limit => -1 на сайтах с огромным числом заказов — лучше делать пакетную обработку по 100–200 заказов за раз с последующим повторным запуском.
  • Добавьте проверку nonce и прав пользователя, если планируете запускать очистку по кнопке в админке.
  • Для больших магазинов лучше выносить очистку заказов в отдельный WP-CLI скрипт, который можно запускать через cron-сервис сервера.
  • Регулярно проверяйте логи ошибок и загрузку сервера, чтобы исключить сбои при массовом удалении.

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

МетодПлюсыМинусыРекомендации
WP-Cron (код) Гибкость, нет сторонних плагинов, можно кастомизировать Зависит от посещаемости сайта, возможны сбои без системного cron Использовать вместе с системным cron, тестировать на тестовом сайте
Плагины для очистки заказов Простая настройка, интерфейс, готовые решения Зависимость от сторонних разработчиков, нагрузка, риск конфликтов Использовать на небольших сайтах или при отсутствии навыков кода
WP-CLI скрипты Высокая производительность, надежность, подходит для больших магазинов Требует доступа к серверу, навыков работы с консолью Рекомендуется для профессиональных администраторов и разработчиков
Автоматическое разделение длинных постов в WordPress
29.01.2026
Как автоматизировать удаление неиспользуемых медиафайлов в WordPress
05.04.2026
WooCommerce: автоматическое удаление неактивных заказов
29.05.2026
WooCommerce: автоматическое удаление неактивных заказов по расписанию
11.06.2026
Как создать собственный виджет в WordPress: подробное руководство с примерами кода
18.11.2025