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

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

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

Решение — реализовать автоматическое удаление заказов с помощью кастомного кода, который будет запускаться по расписанию через WP-Cron.

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

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

Добавим функцию, которая будет выбирать заказы со статусами "cancelled" и "completed", старше указанного количества дней, и удалять их.

function wpcore_delete_old_wc_orders() {
    $days = 30; // количество дней для хранения заказов
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-completed'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'posts_per_page' => 100,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // true — без возможности восстановления
        }
    }
}

2. Регистрация WP-Cron задачи для регулярного запуска

Добавим ежедневный крон-задачу, которая будет вызывать функцию удаления.

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

add_action('wpcore_daily_order_cleanup', 'wpcore_delete_old_wc_orders');

3. Отмена крон-задачи при деактивации темы или плагина

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

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

  • Подключитесь к базе данных через phpMyAdmin или любой другой клиент и выполните запрос для проверки количества заказов с нужными статусами, созданных более 30 дней назад:
SELECT ID, post_date, post_status FROM wp_posts 
WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-completed') 
AND post_date < NOW() - INTERVAL 30 DAY;
  • После первого запуска WP-Cron (например, обновите любой URL сайта для запуска событий) повторите запрос — заказы старше 30 дней должны исчезнуть.
  • В административной панели WooCommerce в разделе "Заказы" проверьте, что старые заказы удалены.
  • Для отладки можно временно добавить запись логов в функцию удаления.

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

  • Крон-задача не запускается: убедитесь, что на сайте есть активный трафик, так как WP-Cron зависит от посещений. Для теста запустите функцию вручную через админку или wp-cli.
  • Удаление не происходит: проверьте, что статусы заказов указаны правильно: WooCommerce добавляет префикс wc-. В запросе WP_Query должны быть wc-cancelled и wc-completed.
  • Заказы не удаляются полностью: функция wp_delete_post с параметром true удаляет запись и метаданные без возможности восстановления. Если параметр не указан, заказы попадают в корзину.
  • Ошибка из-за ограничения памяти или времени выполнения: уменьшите количество заказов на партию в posts_per_page или настройте лимиты PHP.

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

  • Для больших баз данных используйте пакетную обработку, например, удаляйте заказы частями по 50-100 штук за раз.
  • Храните резервные копии базы перед внедрением автоматического удаления — это поможет восстановить данные при ошибках.
  • Избегайте запуска крона слишком часто — достаточно один раз в сутки.
  • Если сайт с большой нагрузкой, рассмотрите возможность переноса задачи на серверный cron, отключив WP-Cron (define('DISABLE_WP_CRON', true);) и настроив системный cron.
  • Регулярно очищайте не только заказы, но и связанные с ними метаданные и транзиенты для уменьшения размера БД.

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

МетодПлюсыМинусыПримеры кода/плагинов
Кастомный код с WP-CronМаксимальный контроль, легковесность, без сторонних плагиновНужно настраивать и тестировать самостоятельноКак в статье выше
Плагины очистки заказовУпрощённая настройка, готовый функционалМогут конфликтовать, нагрузка, не всегда обновляютсяAdvanced Order Cleanup, WooCommerce Order Cleaner
Ручное удаление через админкуПростотаТрудоёмко, риск забыть, не автоматизировано-
Как удалить все комментарии в WordPress быстро и безопасно
05.12.2025
WooCommerce: как автоматически удалять заказы по статусу и дате без плагинов
02.05.2026
WooCommerce: как автоматически удалять старые нераскрытые заказы по дате
19.05.2026
WooCommerce: как автоматически удалять отменённые заказы по дате
05.05.2026
Изменение URL типа записи в WordPress без потери SEO и редиректов
11.12.2025