Оптимизация WooCommerce: как автоматически удалять старые статусы заказов через функции

Диагностика проблемы с накоплением статусов заказов в WooCommerce

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

Типичные признаки проблемы:

  • Медленная работа админки в разделе заказов.
  • Долгие запросы к базе данных при выводе статистики.
  • Повышенный размер таблиц wp_posts и wp_postmeta.

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

Рассмотрим, как с помощью пользовательской функции и WP-Cron настроить регулярную очистку заказов с определённым статусом, например, cancelled или failed, старше 30 дней.

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

function wptemp_delete_old_orders_by_status() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-failed'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '30 days ago',
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $orders = get_posts($args);

    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true для полного удаления
    }
}

2. Регистрируем ежедневное событие WP-Cron

function wptemp_schedule_order_cleanup() {
    if (!wp_next_scheduled('wptemp_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wptemp_daily_order_cleanup');
    }
}
add_action('wp', 'wptemp_schedule_order_cleanup');

add_action('wptemp_daily_order_cleanup', 'wptemp_delete_old_orders_by_status');

3. Опционально: добавляем ручной запуск через URL для отладки

function wptemp_manual_order_cleanup_trigger() {
    if (isset($_GET['wptemp_cleanup']) && current_user_can('manage_options')) {
        wptemp_delete_old_orders_by_status();
        wp_die('Очистка заказов выполнена.');
    }
}
add_action('init', 'wptemp_manual_order_cleanup_trigger');

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

После добавления кода в файл functions.php вашей активной темы или в кастомный плагин:

  • Перейдите в раздел «Заказы» в админке WooCommerce и проверьте количество заказов со статусом cancelled и failed, которым больше 30 дней — они должны исчезнуть после запуска Cron.
  • Для теста вызовите URL https://ваш-сайт.ru/?wptemp_cleanup=1 под пользователем с правами администратора — должна появиться надпись об успешной очистке.
  • Проверьте размер таблиц wp_posts и wp_postmeta до и после очистки через phpMyAdmin или аналогичный инструмент.

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

  • Функция не вызывается по расписанию: Проверьте, активен ли WP-Cron, и что на сайте есть трафик, поскольку WP-Cron запускается при заходе на сайт. Для теста используйте плагин WP Crontrol.
  • Удаляются не все заказы: Проверьте, правильно ли указаны статусы в массиве post_status. WooCommerce использует префикс wc- перед статусом.
  • Удаление не полное (оставляются метаданные): Использование wp_delete_post($order_id, true) гарантирует полное удаление, включая метаданные.
  • Ошибка прав доступа при ручном запуске: Убедитесь, что вызов функции ограничен проверкой права manage_options.

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

  • Не запускайте удаление заказов чаще, чем раз в сутки, чтобы минимизировать нагрузку на базу.
  • Резервное копирование базы перед активацией скрипта — обязательное условие, особенно на живом сайте.
  • Если заказов очень много, разбивайте удаление на пакеты по 100-200 заказов за один запуск, чтобы избежать таймаутов.
  • Для контроля состояния Cron используйте плагин WP Crontrol (https://wordpress.org/plugins/wp-crontrol/).

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

МетодПлюсыМинусы
Плагин (например, WooCommerce Bulk Delete)Простота, интерфейс, настройки без кодаЗависимость от стороннего кода, иногда перегрузка базы
Ручное удаление через админкуКонтроль, без риска ошибок скриптовДолго, неудобно для большого количества заказов
Автоматизированный скрипт WP-Cron (как в статье)Полный контроль, гибкость, без лишних плагиновТребует базовых знаний PHP, настройка Cron
Как использовать WP_Temp для работы с временными данными в WordPress
15.04.2026
Как отключить кэширование AJAX в WordPress: практические решения
19.12.2025
Автоматическое удаление старых корзин (сессий) в WooCommerce без плагинов
20.06.2026
Как добавить адаптивные изображения в WordPress для ускорения сайта
20.11.2025
Как создать автоматический импорт данных в WordPress без плагинов
01.04.2026