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

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

В магазинах на WooCommerce часто возникает необходимость очищать базу от старых заказов со статусами cancelled и completed, особенно если они не нужны для отчетности или занимают слишком много места. Ручное удаление через админку неудобно и трудозатратно, а автоматизация позволяет поддерживать базу в порядке и улучшить производительность.

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

Рассмотрим пример, когда нужно удалять заказы со статусом cancelled и completed, которым больше 90 дней.

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

function wpdev_delete_old_orders() {
    $statuses = array('cancelled', 'completed');
    $days_threshold = 90;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_threshold} days"));

    foreach ($statuses as $status) {
        $args = array(
            'post_type'      => 'shop_order',
            'post_status'    => 'wc-' . $status,
            'date_query'     => array(
                array(
                    'before' => $date_threshold,
                    'inclusive' => true,
                ),
            ),
            'posts_per_page' => -1,
            'fields'         => 'ids',
            'no_found_rows'  => true,
        );

        $orders = get_posts($args);

        if (!empty($orders)) {
            foreach ($orders as $order_id) {
                wp_trash_post($order_id); // помещаем заказ в корзину
                // wp_delete_post($order_id, true); // для полного удаления без корзины
            }
        }
    }
}

Шаг 2. Запускаем функцию по расписанию (WP-Cron)

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

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

add_action('wpdev_daily_order_cleanup', 'wpdev_delete_old_orders');

Шаг 3. Регистрируем деактивацию для очистки WP-Cron

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

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

  • Запустите функцию вручную через wpdev_delete_old_orders() в консоли WP-CLI или временно добавьте вызов в functions.php и проверьте, что заказы старше 90 дней перемещаются в корзину.
  • Проверьте наличие запланированного события WP-Cron через плагин WP Crontrol или команду wp cron event list.
  • Наблюдайте, что ежедневно заказы с соответствующими статусами и датами автоматически очищаются.

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

  • Заказы не удаляются: проверьте, что статусы указаны с префиксом wc- в post_status запроса.
  • Функция не запускается по расписанию: убедитесь, что WP-Cron работает, или настройте системный cron для вызова wp-cron.php.
  • Удаление не полное: wp_trash_post() перемещает заказ в корзину, для полного удаления используйте wp_delete_post($order_id, true).
  • Перегрузка базы при большом количестве заказов: добавьте пагинацию в запрос, например, по 100 заказов за раз, чтобы избежать таймаутов.

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

  • Не удаляйте заказы сразу, лучше перемещайте их в корзину, чтобы была возможность восстановления.
  • Добавьте логирование удаления в файл или метаданные для аудита.
  • Ограничьте количество заказов, обрабатываемых за один запуск, используя параметр posts_per_page и смещением (offset).
  • Для больших магазинов используйте WP-CLI задачи для удаления заказов вне WP-Cron.

Сравнение методов удаления заказов WooCommerce

МетодПлюсыМинусы
Ручное удаление через админкуПросто, визуально контролируемоТрудозатратно, не автоматизировано
WP-Cron с пользовательским кодомАвтоматизация, гибкость, можно настроить фильтрыЗависит от активности сайта, может не запускаться при низком трафике
WP-CLI скриптыБыстро и эффективно, не зависит от WP-CronТребует доступа к серверу и навыков работы с консолью
Плагины для очистки заказовУдобный интерфейс, готовые решенияМогут быть избыточными, влиять на производительность
Удаление продаж WooCommerce по дате и статусу: практическое руководство
03.05.2026
Безопасные автообновления WordPress: настройка и контроль
29.11.2025
Как создать автоматическую регистрацию пользователей в WordPress с помощью WPGPT
10.02.2026
Как удалить незаконченные товары из WooCommerce по дате и статусу
16.06.2026
Автоматическое удаление отменённых и незаконченных заказов WooCommerce по дате
13.07.2026