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

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

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

Решение — автоматизация удаления заказов по определённым критериям: статусу и времени создания.

Как проверить необходимость удаления заказов

  • Перейдите в WooCommerce > Заказы и оцените количество заказов в статусах отменён, завершён, в обработке.
  • Проверьте размер таблицы wp_posts и wp_postmeta через phpMyAdmin — рост этих таблиц связан с количеством заказов.
  • Оцените скорость работы административной панели WooCommerce и время генерации отчётов.

Пошаговое решение: автоудаление заказов через WP-Cron и кастомный код

1. Создание функции удаления заказов

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

function wpstandart_delete_old_woocommerce_orders() {
    $statuses_to_delete = array('cancelled', 'failed'); // статусы для удаления
    $days_old = 30; // удалять заказы старше 30 дней

    $date_query = array(
        'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days")),
        'inclusive' => true,
    );

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => array_map(function($status){ return 'wc-' . $status; }, $statuses_to_delete),
        'date_query' => array($date_query),
        'fields' => 'ids',
        'posts_per_page' => -1,
        'no_found_rows' => true,
    );

    $orders = get_posts($args);

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

2. Регистрация WP-Cron задачи

Чтобы запускать функцию регулярно, зарегистрируйте событие WP-Cron. Добавьте в functions.php следующий код:

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

add_action('wpstandart_daily_order_cleanup', 'wpstandart_delete_old_woocommerce_orders');

Этот код запустит очистку заказов один раз в сутки.

3. Очистка расписания WP-Cron (при необходимости)

Если вы меняете настройки, удалите старое событие:

function wpstandart_clear_order_cleanup_cron() {
    $timestamp = wp_next_scheduled('wpstandart_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpstandart_daily_order_cleanup');
    }
}
// Вызовите эту функцию один раз вручную или при деактивации плагина

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

  • В админке WooCommerce проверьте наличие заказов со статусами, указанными для удаления, старше 30 дней — их должно быть меньше или нет.
  • Через phpMyAdmin убедитесь, что количество записей shop_order уменьшилось.
  • Проверьте логи ошибок или системные логи сервера — убедитесь, что нет ошибок при выполнении WP-Cron.
  • Добавьте временный лог внутри функции удаления, чтобы фиксировать факт удаления заказов.

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

  • WP-Cron не срабатывает: проблема на хостинге с обработкой cron. Проверьте, что сайт посещают регулярно или настройте реальный системный cron на сервере. Убедитесь, что функция wpstandart_daily_order_cleanup зарегистрирована.
  • Заказы не удаляются: проверьте правильность статусов (должны быть с префиксом wc-), и правильность даты. Используйте var_dump для дебага.
  • Удаляются нужные заказы: проверьте фильтр по статусам и дате, чтобы не удалить активные или важные заказы.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления с метаданными, но будьте осторожны с восстановлением данных.
  • Не устанавливайте слишком частый запуск WP-Cron — нагрузка на базу может возрасти.
  • Для сайтов с огромным количеством заказов разбивайте выборку на части (пагинация), чтобы избежать таймаута PHP.
  • Регулярно делайте резервные копии базы данных перед внедрением автоматического удаления.

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

МетодОписаниеПлюсыМинусы
Ручное удаление через админкуУдаление заказов вручную в WooCommerceПросто, без кодаТрудоёмко, риск пропуска заказов
Плагины очистки заказовСторонние плагины для удаления заказовАвтоматизация, гибкие настройкиДоп. нагрузка, возможны конфликты
Кастомный код + WP-CronСамописный скрипт удаления с расписаниемТочный контроль, без сторонних плагиновТребует навыков, необходимость контроля cron
Как повысить производительность WooCommerce при большом количестве товаров
26.05.2026
Как удалить или скрыть адреса постов в WordPress
02.02.2026
Как создать настройки плагинов WordPress: подробное руководство
13.11.2025
Как создать автоматические резервные копии WordPress с помощью PHP и плагинов
01.01.2026
Оптимизация памяти WordPress: эффективные методы и примеры с wpstandart
10.12.2025