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

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

В стандартной установке WooCommerce заказы сохраняются в базе данных бесконечно, что приводит к разрастанию таблиц и замедлению работы сайта и админки. Особенно заметно на больших магазинах с тысячами заказов. Удаление заказов старше определенного срока помогает оптимизировать базу данных и минимизировать нагрузку.

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

Как автоматически удалять заказы старше 30 дней

Выбор подхода: плагин или кастомный код

Для автоматического удаления заказов можно использовать плагин, например WP-Optimize, но он удаляет все записи без фильтрации по типу. Более гибкий и контролируемый способ — добавить кастомный cron-задание в functions.php вашей темы или в отдельном плагине.

Пошаговое создание cron-задачи для удаления заказов

  1. Добавьте кастомное событие cron, запускающееся ежедневно.
  2. В обработчике выполните запрос WP_Query для выборки заказов старше 30 дней.
  3. Удалите заказы с помощью wp_delete_post() с параметром true для полного удаления.

Пример кода для functions.php или плагина

 // Регистрируем ежедневное событие при активации темы или плагина
function wpcodex_schedule_delete_old_orders() {
    if ( ! wp_next_scheduled( 'wpcodex_delete_old_orders_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'wpcodex_delete_old_orders_hook' );
    }
}
add_action( 'wp', 'wpcodex_schedule_delete_old_orders' );

// Основная функция удаления заказов старше 30 дней
function wpcodex_delete_old_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-completed', 'wc-cancelled', 'wc-failed'),
        'date_query'     => array(
            array(
                'before' => date('Y-m-d', strtotime('-30 days')),
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => 50, // лимит на пакет
        'fields'         => 'ids',
    );

    $old_orders = get_posts( $args );

    foreach ( $old_orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}
add_action( 'wpcodex_delete_old_orders_hook', 'wpcodex_delete_old_orders' );

// Очистка cron при деактивации
function wpcodex_clear_delete_old_orders_cron() {
    $timestamp = wp_next_scheduled( 'wpcodex_delete_old_orders_hook' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpcodex_delete_old_orders_hook' );
    }
}
register_deactivation_hook( __FILE__, 'wpcodex_clear_delete_old_orders_cron' );

Как проверить, что удаление работает

  • В админке WooCommerce перейдите в «Заказы» и посмотрите заказы старше 30 дней — они должны отсутствовать после запуска cron.
  • В базе данных таблице wp_posts записи с post_type = 'shop_order' и датой создания более 30 дней назад должны отсутствовать.
  • Можно вручную запустить функцию wpcodex_delete_old_orders() через WP CLI или временно вызвать её для теста.

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

  • Удаление не происходит: Проверьте, что cron действительно запускается. Используйте плагин WP Crontrol для просмотра и запуска cron задач.
  • Заказы не удаляются полностью: Убедитесь, что в wp_delete_post передан параметр true для полного удаления, иначе заказ может быть перемещен в корзину.
  • Удаляются не те заказы: Проверьте параметры post_status и date_query — возможно, необходимо расширить или сузить фильтр.
  • Перегрузка сервера: Если заказов слишком много, уменьшите posts_per_page и реализуйте повторный вызов до тех пор, пока не удалите все старые заказы.

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

  • Перед удалением сделайте резервную копию базы данных, чтобы избежать потери важных данных.
  • Для больших магазинов запускайте удаление в ночное время, чтобы не мешать работе сайта.
  • Не удаляйте заказы со статусом «обрабатывается» или «ожидает оплаты», чтобы не потерять данные текущих продаж.
  • Если используете сторонние плагины для отчетов, проверьте, что удаление заказов не сломает отчеты.

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

МетодПлюсыМинусыРекомендации
Плагин (WP-Optimize и др.)Простота, готовое решениеМожет удалить лишнее, нет гибкости в фильтрацииИспользовать для общей чистки базы, не для выборочного удаления заказов
Кастомный cron с кодомТочный контроль, можно фильтровать по статусам и дате, гибкостьНужно написать и протестировать кодРекомендуется для опытных разработчиков и крупных магазинов
Ручное удаление через SQLБыстро и эффективноРиск повредить данные, требует навыков SQLИспользовать только с резервной копией и в крайнем случае
Автоматический импорт данных из Excel в WordPress
06.12.2025
WooCommerce: как автоматически удалять старые заказы через 30 дней
13.06.2026
Как удалить неиспользуемые метаданные в WordPress для оптимизации базы данных
23.03.2026
Как использовать вебхуки в WordPress для автоматизации задач
02.03.2026
Как создать автоматический импорт данных из Google Sheets в WordPress
14.01.2026