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

Проблема: накопление старых заказов в WooCommerce и влияние на производительность

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

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

Для начала стоит проверить текущее количество заказов и их возраст. Это можно сделать через WP-CLI или SQL-запрос:

SELECT COUNT(ID), MIN(post_date), MAX(post_date) FROM wp_posts WHERE post_type = 'shop_order';

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

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

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

function wptool_delete_old_woocommerce_orders() {
    if (!class_exists('WooCommerce')) {
        return;
    }

    $days = 365; // удалять заказы старше 365 дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

    $old_orders = get_posts($args);

    if (empty($old_orders)) {
        return;
    }

    foreach ($old_orders as $order_id) {
        wp_delete_post($order_id, true); // true - принудительное удаление
    }
}

2. Запускаем эту функцию автоматически с помощью WP-Cron, чтобы удалять старые заказы раз в неделю:

add_action('wptool_weekly_order_cleanup', 'wptool_delete_old_woocommerce_orders');

if (!wp_next_scheduled('wptool_weekly_order_cleanup')) {
    wp_schedule_event(time(), 'weekly', 'wptool_weekly_order_cleanup');
}

3. Если нужно, можно запустить функцию вручную в админке через AJAX или WP-CLI.

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

  • Выполните запрос SQL из раздела диагностики до и после удаления — количество заказов должно уменьшиться.
  • Проверьте в админке WooCommerce — старые заказы должны исчезнуть.
  • Проверьте логи ошибок и убедитесь, что нет фатальных ошибок при удалении.
  • Для ручного запуска можно добавить временный вызов wptool_delete_old_woocommerce_orders(); и проверить вывод ошибок.

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

  • Ничего не удаляется: проверьте, что статусы заказов в запросе соответствуют вашим. Возможно, у вас другие статусы.
  • Удаляются нужные заказы: проверьте значение переменной $days и дату, по которой идёт фильтр.
  • Проблемы с производительностью: уменьшите число posts_per_page или разбивайте удаление на несколько шагов.
  • Заказы не удаляются полностью: используйте wp_delete_post($order_id, true) с параметром true для полного удаления, иначе заказы попадут в корзину.

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

  • Перед автоматическим удалением обязательно делайте резервную копию базы данных.
  • Не запускайте удаление часто — 1 раз в неделю или месяц достаточно, чтобы не перегружать сервер.
  • Включите логирование ошибок удаления для мониторинга и отладки.
  • Проверяйте, что удаление не ломает связи с другими плагинами, особенно если вы используете сторонние расширения WooCommerce.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПростотаДолго, неудобно при большом количествеМало заказов
Плагины очистки базыУдобство, дополнительные функцииМогут замедлять сайт, риск конфликтовДля быстрого решения без кода
Автоматический скрипт с WP-CronАвтоматизация, гибкость, контрольНужно писать код и тестироватьБольшие магазины, требующие регулярной очистки
Как создать автоматические уведомления в WordPress с помощью хуков и AJAX
10.03.2026
Как создать автоматическую переадресацию в WordPress по условиям
17.04.2026
Как создать динамическую отображающуюся таблицу в WordPress с помощью shortcode
12.02.2026
Как использовать WP-CLI для массового управления постами в WordPress
22.05.2026
Как создать динамическую страницу в WordPress с помощью shortcode
19.12.2025