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

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

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

Подготовка к автоматическому удалению заказов

Прежде чем внедрять автоматическое удаление, убедитесь в следующем:

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

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

Для автоматизации используем WP-Cron — встроенный планировщик WordPress. В примере ниже удаляем заказы со статусом cancelled старше 30 дней.

<?php
// 1. Регистрируем задачу планировщика
add_action('wp', function() {
    if (!wp_next_scheduled('wc_delete_old_cancelled_orders')) {
        wp_schedule_event(time(), 'daily', 'wc_delete_old_cancelled_orders');
    }
});

// 2. Функция удаления заказов
add_action('wc_delete_old_cancelled_orders', function() {
    $days = 30; // сколько дней считать "старыми"
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'date_query'     => [
            [
                'column'    => 'post_date',
                'before'    => $date_threshold,
            ]
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $orders = get_posts($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true — удаление без восстановления
    }
});

// 3. Очистка при деактивации темы или плагина
register_deactivation_hook(__FILE__, function() {
    wp_clear_scheduled_hook('wc_delete_old_cancelled_orders');
});
?>

Объяснение: скрипт регистрирует ежедневную задачу, которая ищет заказы со статусом cancelled, созданные более 30 дней назад, и удаляет их.

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

  • Для другого статуса замените 'post_status' => 'wc-cancelled' на нужный, например 'wc-failed' или 'wc-pending'.
  • Период меняется в переменной $days.

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

Чтобы проверить, что скрипт работает:

  1. Создайте тестовый заказ в нужном статусе с датой старше пороговой.
  2. Принудительно запустите Cron-задачу через плагин WP Crontrol или вручную вызвав хук:
do_action('wc_delete_old_cancelled_orders');

3. Проверьте, что заказ удалён в админке WooCommerce.

4. Для автоматической проверки смотрите в wp_cron логи или используйте плагин WP Crontrol, чтобы убедиться, что событие запланировано и выполняется.

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

  • Заказы не удаляются
    Причина: WP-Cron не срабатывает на сайте без трафика. Решение: настройте системный cron на сервере или используйте плагин WP Crontrol для принудительного запуска.
  • Удаляются не те заказы
    Причина: неверно указан статус или период в запросе.
    Проверьте правильность post_status и формат даты.
  • Производительность страдает при большом количестве заказов
    Решение: добавьте постраничную обработку, например, удалять по 100 заказов за один запуск.

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

  • Всегда делайте резервные копии перед удалением данных.
  • Удаляйте заказы только с проверенными статусами, чтобы не потерять важную информацию.
  • Используйте wp_delete_post($order_id, true) с флагом true, чтобы полностью удалить заказ, а не отправлять в корзину.
  • Для крупных магазинов используйте пакетную обработку заказов (по 50-100 штук за раз), чтобы избежать таймаутов.
  • Мониторьте логи ошибок сервера и WordPress для выявления сбоев в работе cron-задач.

Таблица сравнения вариантов удаления заказов

МетодПлюсыМинусыПодходит для
Ручное удаление через админкуПросто, без кодаТрудозатратно при большом количествеМаленькие магазины
Плагин (например, WP Bulk Delete)Удобство, графический интерфейсДополнительные зависимости, нагрузкаСредние магазины
Автоматический скрипт на WP-CronАвтоматизация, гибкостьТребует навыков программированияСредние и крупные магазины
Как создать собственный шорткод в WordPress
05.11.2025
Оптимизация загрузки библиотек в WordPress для ускорения сайта
07.02.2026
Как закрыть от индексации страницы поиска в WordPress без потери внутренней навигации
19.08.2026
Автоподгрузка постов в WordPress без плагинов
25.02.2026
Как отключить индексацию страниц авторов в WordPress без потери SEO
16.08.2026