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

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

В интернет-магазине на WooCommerce с течением времени накапливается большое количество заказов, включая закрытые (статус completed, cancelled, refunded и другие). Это приводит к увеличению размера базы данных, замедлению запросов и нагрузке на сервер. Особенно актуально для крупных магазинов с тысячами заказов.

Проверить количество заказов и их статусы можно через phpMyAdmin или с помощью WP CLI:

wp post list --post_type=shop_order --fields=ID,post_status --format=table

Если число закрытых заказов превышает десятки тысяч, стоит рассмотреть автоматизацию их удаления.

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

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

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

function wc_delete_old_closed_orders() {
    // Устанавливаем дату удаления (например, заказы старше 180 дней)
    $date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    // Получаем ID заказов со статусами 'completed', 'cancelled', 'refunded'
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-completed', 'wc-cancelled', 'wc-refunded'],
        'date_query'     => [
            [
                'before' => $date_threshold,
                'inclusive' => true,
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true - чтобы удалить без возможности восстановления
        }
    }
}

2. Настраиваем регулярное выполнение через WP-Cron

Добавьте запуск функции, например, раз в неделю:

// Регистрируем крон задачу
add_action('wc_delete_old_orders_event', 'wc_delete_old_closed_orders');

if (! wp_next_scheduled('wc_delete_old_orders_event')) {
    wp_schedule_event(time(), 'weekly', 'wc_delete_old_orders_event');
}

При необходимости можно изменить период на 'daily' или 'monthly'.

3. Запуск задачи вручную для проверки

Для теста можно вызвать функцию напрямую в админке (например, через админский плагин Code Snippets) или временно добавить вызов в functions.php:

add_action('admin_init', function() {
    if (current_user_can('administrator') && !get_transient('wc_delete_orders_ran')) {
        wc_delete_old_closed_orders();
        set_transient('wc_delete_orders_ran', 1, 12 * HOUR_IN_SECONDS);
    }
});

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

  • Проверьте количество заказов с удаленными статусами в админке WooCommerce — их должно стать меньше.
  • Запустите запрос через WP CLI или phpMyAdmin, как в разделе диагностики, чтобы убедиться, что старые заказы удалены.
  • Просмотрите логи ошибок сервера, чтобы убедиться, что удаление не вызывает проблем.

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

  • Удаление не происходит: проверьте, что событие WP-Cron зарегистрировано и запускается (используйте плагин WP Crontrol).
  • Удаление происходит, но заказы остаются: убедитесь, что статус заказов совпадает с указанными в фильтре (wc-completed и т.п.), не используйте просто completed.
  • Высокая нагрузка при удалении большого количества заказов: разбейте удаление на чанки, например, по 100 заказов за раз, используя пагинацию в get_posts.

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

  • Используйте параметр wp_delete_post($order_id, true) для полного удаления без корзины, если уверены, что заказы больше не нужны.
  • Настройте резервное копирование базы данных перед внедрением автоматического удаления.
  • При большом объеме данных удаляйте заказы частями, чтобы не перегружать сервер.
  • Убедитесь, что ваши плагины и кастомный код не зависят от удаляемых заказов (например, аналитика или интеграции).

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

МетодОписаниеПреимуществаНедостатки
Ручное удаление через админкуУдаление заказов вручную через WooCommerceПросто, не требует кодаНепрактично при большом объеме заказов
Автоматический скрипт через WP-CronКод, который удаляет заказы по расписаниюАвтоматизация, масштабируемостьТребуется тестирование и мониторинг
Плагины для очистки базыГотовые решения от сторонних разработчиковУдобство, дополнительные функцииМогут быть избыточны, нагрузка на сайт
Как создать автоматический бэкап базы данных WordPress на WPengine
03.01.2026
Как создать свой плагин для WordPress с нуля
12.11.2025
WooCommerce: решение проблемы не работающих вариативных атрибутов в описании товара
16.05.2026
Как создать автоматический импорт CSV файлов в WordPress с примерами кода
27.03.2026
Автоматическое обновление остатков и цен товаров в WooCommerce с данными от поставщиков
20.07.2026