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

Диагностика проблемы с неактивными заказами в WooCommerce

На крупных WooCommerce-магазинах с количеством заказов в тысячи и более часто возникает проблема накопления неактивных заказов. Это заказы, которые не были оплачены или отменены, но продолжают занимать место в базе данных, замедляя её и усложняя отчёты. При этом стандартных инструментов WooCommerce для массового удаления таких заказов нет.

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

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

Пошаговое решение через WP Cron и кастомный код

WooCommerce хранит заказы как тип записи shop_order. Для удаления неактивных заказов по дате можно написать функцию, которая будет запускаться по расписанию (WP Cron) и удалять заказы согласно заданным условиям.

function wpdir_delete_inactive_orders() {
    $days_threshold = 30; // количество дней, после которых заказ считается неактивным
    $statuses_to_delete = array('pending', 'failed', 'cancelled');

    $date_query = array(
        'column' => 'post_modified_gmt',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days_threshold} days")),
    );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses_to_delete,
        'date_query'     => array($date_query),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление без перемещения в корзину
        }
    }
}

// Планируем задачу, если не запланирована
if (!wp_next_scheduled('wpdir_daily_delete_inactive_orders')) {
    wp_schedule_event(time(), 'daily', 'wpdir_daily_delete_inactive_orders');
}

// Хук на выполнение задачи
add_action('wpdir_daily_delete_inactive_orders', 'wpdir_delete_inactive_orders');

Объяснение кода

  • Функция wpdir_delete_inactive_orders ищет все заказы со статусом pending, failed и cancelled, у которых дата последнего изменения старше 30 дней.
  • Удаление происходит с помощью wp_delete_post с флагом true для полного удаления.
  • Задача запускается ежедневно через WP Cron.

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

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

  1. В админке WooCommerce откройте список заказов, отфильтруйте по статусу pending или failed.
  2. Проверьте, что есть заказы старше 30 дней (обратите внимание на дату изменения). Можно сделать экспорт или выгрузку для анализа.
  3. Запустите функцию вручную, вызвав wpdir_delete_inactive_orders() в консоли WP-CLI или подключив временно вызов в functions.php.
  4. Обновите страницу заказов, чтобы убедиться, что старые неактивные заказы удалились.
  5. Проверьте логи сервера и ошибок для исключения сбоев.

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

  • Крон-задача не выполняется. Причина: WP Cron требует посетителей сайта для запуска. Решение: настроить системный cron на запуск wp-cron.php или использовать плагин для управления cron.
  • Удаляются активные заказы. Проверьте правильность статусов в массиве $statuses_to_delete, убедитесь, что не включаете статусы, которые не следует удалять.
  • Заказы не удаляются. Возможно, проблема с правами или установка wp_delete_post не срабатывает. Проверьте, что пользователь с нужными правами и нет плагинов, блокирующих удаление.
  • Долгая работа функции. При большом количестве заказов удаление может занимать время. Решение: реализовать пакетное удаление по 100 заказов за один запуск или использовать WP CLI для пакетной очистки.

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

  • Перед автоматическим удалением всегда делайте регулярные резервные копии базы данных.
  • Используйте транзакции или WP CLI для массовых операций, чтобы избежать блокировки базы.
  • Для больших магазинов лучше запускать очистку ночью через системный cron.
  • Можно добавить логирование удалённых заказов для аудита, например, записывая ID и дату удаления в отдельный файл или таблицу.
  • Если у вас стоит плагин Clearfy Pro, можно дополнительно оптимизировать очистку и очистку базы после удаления заказов — https://wpshop.ru/plugins/clearfy?source=wpdir.ru&medium=article&campaign=woocommerce-avto-udaleniye-neaktivnyh-zakazov-po-datumu

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

МетодПлюсыМинусыПрименимость
Ручное удаление через админку Простота, не требует кода Долгая, не подходит для больших объёмов Маленькие магазины
Автоматизация через WP Cron + код Полный контроль, регулярность, без плагинов Требует навыков, WP Cron зависит от посещаемости Средние и крупные магазины
Плагины очистки заказов Удобство, интерфейс, дополнительные функции Зависимость от плагина, возможна нагрузка Любой магазин, если необходима простота
Как использовать REST API для автоматизации задач в WordPress
12.04.2026
WooCommerce: автоматическое удаление неактивных вариантов и атрибутов
23.06.2026
Как настроить выработку изображений в WordPress для улучшения производительности
10.01.2026
Оптимизация базы данных WordPress: практические советы и примеры
17.11.2025
Как удалить версии записей в WordPress для оптимизации базы данных
04.02.2026