Автоматическое удаление старых заказов WooCommerce: настройка и практические решения

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

В интернет-магазинах на WooCommerce с течением времени накапливается большое количество заказов, включая отменённые, завершённые и старые статусы. Это может замедлять работу админки, увеличивать нагрузку на базу данных и усложнять администрирование. Автоматическое удаление заказов старше определённого срока позволяет поддерживать базу в оптимальном состоянии, экономить ресурсы и облегчить управление.

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

Для начала нужно понять, не загружена ли база излишне старыми заказами. Это можно проверить через SQL-запрос в базе данных или через инструменты WooCommerce:

  • Подключитесь к базе данных через phpMyAdmin или другой клиент.
  • Выполните запрос для подсчёта заказов с определённым возрастом, например старше 180 дней:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_date < DATE_SUB(NOW(), INTERVAL 180 DAY);

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

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

1. Создаём кастомную функцию для удаления заказов

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

function wporders_delete_old_woocommerce_orders() {
    global $wpdb;
    $days = 180; // удалять заказы старше 180 дней

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID заказов, которые старше указанной даты и не в статусах, которые нужно сохранить
    $orders_to_delete = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_date < %s",
        $date_threshold
    ));

    if (!empty($orders_to_delete)) {
        foreach ($orders_to_delete as $order_id) {
            wp_delete_post($order_id, true); // true - без перемещения в корзину
        }
    }
}

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

Добавьте регистрацию cron-задачи и планировщик:

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

add_action('wporders_delete_old_orders_hook', 'wporders_delete_old_woocommerce_orders');

Это будет запускать удаление раз в сутки.

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

  • До запуска скрипта проверьте количество заказов старше заданного порога в базе SQL (пример выше).
  • После первого запуска cron через wp-cron или вручную вызовите функцию wporders_delete_old_woocommerce_orders() и проверьте, что количество заказов уменьшилось.
  • В админке WooCommerce убедитесь, что старые заказы действительно исчезли.
  • Для ручного принудительного запуска можно временно добавить вызов функции в functions.php и обновить любую страницу.

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

  • Удаление не происходит: проверьте, активирован ли wp-cron, и вызывается ли хук wporders_delete_old_orders_hook. Для теста вызовите функцию вручную.
  • Удаляются нужные заказы: уточните условия выборки, можно добавить фильтр по статусу, например, исключать статусы 'wc-processing', 'wc-on-hold'.
  • Скрипт занимает много времени: если заказов много, удаление лучше делать пакетами (например, 100 заказов за запуск), чтобы избежать таймаутов.
  • Проблемы с правами доступа: убедитесь, что пользователь базы данных имеет права на удаление записей.

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

  • Не удаляйте заказы со статусами, которые могут быть нужны для отчетности или бухгалтерии. Добавьте фильтр исключения этих статусов в запрос.
  • Реализуйте пакетную обработку, чтобы скрипт не превышал лимиты PHP и MySQL.
  • Для надежности используйте WP-CLI для запуска задач на серверах с поддержкой командной строки.
  • Резервируйте базу данных перед массовым удалением заказов.

Пример улучшенного кода с фильтрацией по статусам и пакетной обработкой

function wporders_delete_old_orders_batch() {
    global $wpdb;
    $days = 180;
    $batch_size = 100;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $excluded_statuses = [
        'wc-processing',
        'wc-on-hold',
        'wc-completed'
    ];

    // Формируем SQL для исключения статусов
    $placeholders = implode(",", array_fill(0, count($excluded_statuses), '%s'));

    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
        WHERE post_type = 'shop_order' 
        AND post_date < %s 
        AND ID NOT IN ( 
            SELECT post_id FROM {$wpdb->postmeta} 
            WHERE meta_key = '_order_status' AND meta_value IN ($placeholders) 
        ) 
        LIMIT %d",
        array_merge([$date_threshold], $excluded_statuses, [$batch_size])
    );

    $orders = $wpdb->get_col($query);

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

add_action('wporders_delete_old_orders_hook', 'wporders_delete_old_orders_batch');

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

МетодПлюсыМинусыКомпромисс
Ручная очистка через SQLБыстро и напрямуюРиск ошибок, нельзя автоматизироватьИспользовать только для разовой очистки
WP-Cron с кастомным скриптомАвтоматизация, гибкостьЗависит от wp-cron, возможны таймаутыДобавлять пакетную обработку
Плагины для очистки заказовПростота настройки, GUIМожет создавать нагрузку, не всегда гибкиеИспользовать для небольших магазинов
Как создать автоматический отчет по заказам в WordPress без WooCommerce
10.04.2026
Добавление пользовательских статусов заказов в WooCommerce: подробное руководство с примерами кода
03.04.2026
Массовое обновление статусов заказов в WooCommerce: практическое руководство
17.05.2026
Как добавить автоматический импорт заказов в WordPress без WooCommerce
19.03.2026
Добавление пользовательского поля в форму оформления заказа WooCommerce без плагинов
24.12.2025