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

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

Интернет-магазины на WooCommerce могут накапливать большое количество заказов в базе данных, что замедляет сайт и усложняет администрирование. Особенно это касается заказов в статусе «отменён», «ожидание оплаты» или «выполнено» старше определённого срока.

Автоматическое удаление устаревших заказов помогает поддерживать чистоту базы и ускорять работу сайта без дополнительных плагинов.

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

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

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

if ( ! wp_next_scheduled( 'wc_delete_old_orders_daily' ) ) {
    wp_schedule_event( time(), 'daily', 'wc_delete_old_orders_daily' );
}

2. Функция удаления заказов старше N дней

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

function wc_delete_old_orders() {
    $days = 30; // Срок хранения заказов в днях
    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = array(
        'post_type'      => 'shop_order',
        'posts_per_page' => -1,
        'post_status'    => array('wc-cancelled', 'wc-failed', 'wc-completed'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'fields'         => 'ids',
    );

    $orders = get_posts( $args );

    if ( ! empty( $orders ) ) {
        foreach ( $orders as $order_id ) {
            wp_delete_post( $order_id, true );
        }
    }
}
add_action( 'wc_delete_old_orders_daily', 'wc_delete_old_orders' );

3. Добавление очистки при деактивации темы или плагина

Чтобы не оставлять запланированные задачи без контроля, удалим крон-событие при деактивации.

function wc_delete_old_orders_deactivate() {
    wp_clear_scheduled_hook( 'wc_delete_old_orders_daily' );
}
register_deactivation_hook( __FILE__, 'wc_delete_old_orders_deactivate' );

Проверка результата

  • Запустите код и проверьте в базе данных наличие заказов старше 30 дней со статусами cancelled, failed, completed.
  • Вручную вызовите функцию wc_delete_old_orders() через WP-CLI или временно добавьте вызов в админке, чтобы убедиться, что заказы удаляются.
  • Проверьте, что событие wc_delete_old_orders_daily добавлено в расписание WP-Cron (например, с помощью плагина WP Crontrol).

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

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

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

  • Не устанавливайте слишком маленький срок хранения заказов (например, меньше 7 дней), чтобы избежать случайной потери данных.
  • Удаляйте заказы только с определёнными статусами, чтобы не потерять активные или важные заказы.
  • Если заказов много, делайте удаление пакетами (например, по 50-100 за раз), чтобы избежать проблем с нагрузкой и таймаутами.
  • Для контроля добавьте логирование удалённых заказов в отдельный файл или системный журнал.

Сравнение способов удаления заказов: плагин vs код

МетодПреимуществаНедостатки
Плагин (например, WP Sweep, Advanced Database Cleaner)Удобный интерфейс, дополнительные функции очистки, регулярные обновленияДополнительная нагрузка, зависимость от стороннего кода, возможные конфликты
Самописный код (как в статье)Лёгкий, гибкий, без лишних зависимостей, точечное решениеТребует навыков программирования, необходимость поддержки кода
WooCommerce: автоматическое возврат средств при отмене заказа через код
13.05.2026
Как установить и настроить WooCommerce для интернет-магазина на WordPress
24.11.2025
WooCommerce: автоматическое удаление заказов по времени без плагинов
20.06.2026
Как использовать WPRemark для массового комментирования и управления отзывами в WordPress
15.01.2026
Как создать собственный плагин в WordPress
10.11.2025