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

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

В интернет-магазинах на WooCommerce с течением времени накапливается большое количество заказов. Старые заказы, особенно с определённым статусом (например, отменённые или просроченные), могут засорять базу данных, замедлять её работу и влиять на производительность сайта. Кроме того, хранение большого объема ненужных данных увеличивает размер резервных копий и усложняет администрирование.

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

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

1. Определение критериев удаления

Для начала определим, какие заказы нужно удалять автоматически. Чаще всего это заказы в статусах:

  • cancelled — отменённые;
  • failed — неудачные;
  • refunded — возвращённые;
  • pending с истекшим сроком оплаты.

Также нужно учитывать возраст заказа — например, удалять заказы, которые старше 30 дней.

2. Использование WP-Cron для периодического запуска задачи

Создадим функцию, которая будет искать и удалять заказы по заданным критериям, и зарегистрируем её в планировщике задач WordPress (WP-Cron).

3. Пример кода для functions.php темы

function wc_delete_old_orders() {
    $days_to_keep = 30; // количество дней хранения
    $statuses_to_delete = array('cancelled', 'failed', 'refunded', 'pending');
    
    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days_to_keep} days")),
        'inclusive' => true,
    );

    // WP_Query для заказов с нужным статусом и датой
    $args = array(
        'post_type' => 'shop_order',
        'post_status' => $statuses_to_delete,
        'date_query' => array($date_query),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );
    
    $orders = get_posts($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            // Удаляем заказ
            wp_delete_post($order_id, true); // true — без перемещения в корзину
        }
    }
}

// Регистрируем событие в WP-Cron
if (!wp_next_scheduled('wc_delete_old_orders_event')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_old_orders_event');
}

// Хук для запуска функции
add_action('wc_delete_old_orders_event', 'wc_delete_old_orders');

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

1. Убедитесь, что крон-событие запланировано. Для этого можно использовать плагин WP Crontrol. В разделе «Cron Events» найдите wc_delete_old_orders_event и проверьте дату следующего запуска.

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

add_action('init', function() {
    if (current_user_can('administrator')) {
        wc_delete_old_orders();
        echo 'Old orders deleted';
        exit;
    }
});

После подтверждения работы удалите этот код.

3. Проверьте базу данных или список заказов в админке WooCommerce — заказы с указанными статусами и датой старше 30 дней должны исчезнуть.

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

  • Крон-событие не запускается: проверьте, что на сервере разрешён WP-Cron (файл wp-config.php не содержит define('DISABLE_WP_CRON', true);) и что посещения сайта есть. Для сайтов с низкой посещаемостью настройте системный cron для вызова wp-cron.php.
  • Заказы не удаляются: убедитесь, что статусы заказов в массиве $statuses_to_delete совпадают с реальными статусами в базе. Проверьте права пользователя, от имени которого запускается скрипт.
  • Удаляются не те заказы: проверьте правильность параметра date_query и формат даты. Для отладки временно выводите ID заказов перед удалением.

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

  • Удаляйте заказы только если уверены, что данные больше не нужны для отчётов и бухгалтерии.
  • Резервное копирование базы данных перед внедрением автоматического удаления — обязательное условие.
  • Для больших магазинов с тысячами заказов разбивайте удаление на части, например, с помощью параметра posts_per_page и пагинации, чтобы избежать таймаутов.
  • Используйте транзиенты или опции для хранения времени последнего удаления, чтобы контролировать выполнение и не запускать задачу чаще, чем нужно.
  • При необходимости ведите лог удалённых заказов для аудита.

Сравнение способов автоматического удаления заказов

СпособПлюсыМинусы
Плагин (например, WP Bulk Delete)Готовое решение, интерфейс, гибкие настройкиДополнительная нагрузка, возможные конфликты, платные функции
Код в functions.php + WP-CronЛегковесно, не зависит от сторонних плагинов, полный контрольТребует навыков разработки, нужно следить за корректностью работы
Ручное удаление через админкуПросто, не требует кодаТрудозатратно, не подходит для больших объёмов
Как удалить или изменить slug в WordPress без потери SEO
14.11.2025
WordPress: как избежать конфликтов между плагинами и быстро находить ошибки
23.12.2025
Как удалить данные пользователя из базы WordPress без ошибок
19.02.2026
Как установить разные версии PHP для WordPress на одном сервере
12.03.2026
Как отключить Emoji в WordPress для ускорения сайта
10.04.2026