Оптимизация 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
Как создать свой плагин для WordPress с обратной связью
30.11.2025
Как удалить или изменить регистрацию пользователя в WordPress без плагинов
10.01.2026
Как исправить ошибку 'wp_temp' при работе с временными таблицами в WordPress
29.12.2025
Как запретить регистрацию ботов в WordPress без плагинов
19.03.2026
Как эффективно использовать wp_enqueue_style и wp_enqueue_script в WordPress
26.03.2026