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

Зачем удалять старые отгруженные заказы в WooCommerce

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

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

Перед автоматизацией убедитесь, что именно старые completed-заказы вызывают нагрузку:

  • Проверьте количество заказов в базе: в phpMyAdmin выполните запрос SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-completed'. Если их тысячи или десятки тысяч, это повод для оптимизации.
  • Оцените размер таблиц wp_posts и wp_postmeta через панель хостинга или с помощью плагина типа WP-Optimize.
  • Проверьте время загрузки страниц с заказами в админке WooCommerce.

Если нагрузка высокая и база растёт, автоматизация удаления уместна.

Пошаговое решение: создаём cron-задачу для удаления старых заказов

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

function wptask_delete_old_completed_orders() {
    global $wpdb;
    $days = 90; // количество дней для хранения заказов
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

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

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

2. Регистрируем cron-задачу, которая будет запускаться ежедневно

function wptask_register_daily_delete_event() {
    if (!wp_next_scheduled('wptask_daily_delete_old_orders')) {
        wp_schedule_event(time(), 'daily', 'wptask_daily_delete_old_orders');
    }
}
add_action('wp', 'wptask_register_daily_delete_event');
add_action('wptask_daily_delete_old_orders', 'wptask_delete_old_completed_orders');

3. Отключаем cron-задачу при деактивации темы или плагина

function wptask_deactivate_clear_cron() {
    $timestamp = wp_next_scheduled('wptask_daily_delete_old_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wptask_daily_delete_old_orders');
    }
}
register_deactivation_hook(__FILE__, 'wptask_deactivate_clear_cron');

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

  • Добавьте временный лог в функцию удаления заказов, например, запись в лог-файл или отправку email с количеством удалённых заказов.
  • Запустите вручную функцию wptask_delete_old_completed_orders() через WP-CLI: wp eval 'wptask_delete_old_completed_orders();' и проверьте, что заказы удалились.
  • Проверьте через админку WooCommerce или базу данных, что старые completed-заказы исчезли.
  • Убедитесь, что cron-задача запланирована: в WP-CLI wp cron event list | grep wptask_daily_delete_old_orders.

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

  • Заказы не удаляются: убедитесь, что статус заказа именно wc-completed, а не completed или другой. WooCommerce использует префикс wc- для статусов.
  • Удаляются не те заказы: проверьте условие по дате. Важно сравнивать post_date, а не дату статуса.
  • Проблемы с производительностью при удалении большого количества заказов: делайте удаление партиями, например, по 50 заказов за раз, чтобы не перегружать сервер.
  • Cron-задача не запускается: убедитесь, что на сайте посещения есть для запуска WP-Cron, либо настройте системный cron на вызов wp-cron.php.

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

  • Всегда делайте резервную копию базы перед внедрением автоматического удаления заказов.
  • Используйте WP-CLI для ручного запуска и отладки функции удаления.
  • Если база очень большая, используйте пакетную обработку с ограничением количества удаляемых заказов за один запуск.
  • Добавьте проверку nonce или ограничьте выполнение функции для администраторов, если вызываете удаление вручную.
  • Для дополнительной безопасности храните копии важных заказов в отдельной таблице или внешнем хранилище, если они нужны для отчётности.

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

МетодПлюсыМинусы
Ручное удаление через админку WooCommerceПросто, не требует кодаТрудозатратно, риск пропустить старые заказы
Плагин для удаления заказов (например, WP Bulk Delete)Удобный интерфейс, гибкие фильтрыМожет нагружать сайт, платные версии для автозапуска
Код с WP-Cron для автоматического удаленияАвтоматизация, контроль над процессом, бесплатныйТребует навыков программирования, настройка cron
Как добавить поле в форму регистрации WordPress с подтверждением email
21.01.2026
Как удалить ненужные мета данные WordPress для ускорения сайта
19.12.2025
Как создать автоматический импорт из внешнего источника в WordPress
11.04.2026
Как автоматизировать удаление старых медиа файлов в WordPress
31.01.2026
WordPress автоматическое удаление спама в комментариях: эффективные решения
30.11.2025