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

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

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

Шаг 1. Определяем критерии для удаления заказов

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

  • Выбрать статус заказа (например, completed или cancelled).
  • Установить порог по времени, например, удалять заказы старше 90 дней.

Важно: удаление происходит без возврата, поэтому желательно делать резервные копии базы данных перед внедрением.

Шаг 2. Реализация автоматического удаления заказов с помощью wp-cron

Создадим функцию, которая будет запускаться по расписанию и удалять заказы по заданным параметрам.

Регистрация события wp-cron

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

Функция удаления заказов

add_action( 'wpstuff_delete_old_orders', 'wpstuff_delete_orders_by_status_and_date' );

function wpstuff_delete_orders_by_status_and_date() {
    $status = 'completed'; // Статус заказов для удаления
    $days = 90; // Возраст заказа в днях

    $date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-' . $status,
        'date_query'     => array(
            array(
                'before' => $date,
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $query = new WP_Query( $args );
    if ( $query->have_posts() ) {
        foreach ( $query->posts as $order_id ) {
            wp_delete_post( $order_id, true );
        }
    }
}

Шаг 3. Очистка и проверка результата

После добавления кода в functions.php темы или в собственный плагин, можно вручную запустить задачу для проверки, например, через WP-CLI:

wp cron event run wpstuff_delete_old_orders

Или временно вызвать функцию напрямую:

add_action( 'init', function() {
    if ( current_user_can( 'manage_woocommerce' ) ) {
        wpstuff_delete_orders_by_status_and_date();
    }
} );

Проверяем в админке WooCommerce — старые заказы выбранного статуса должны исчезнуть.

Чек-лист для проверки правильности работы

  • Код добавлен без синтаксических ошибок.
  • В базе есть заказы с нужным статусом и датой старше установленного порога.
  • Задача wp-cron зарегистрирована (проверить через wp cron event list или плагин WP Crontrol).
  • После запуска функция удаляет заказы.
  • Резервная копия базы перед тестами сделана.

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

Заказы не удаляются

  • Неправильно указан статус заказа. В WooCommerce статусы имеют префикс wc-. Например, wc-completed.
  • Отсутствует событие wp-cron или оно не запускается. Проверить через WP Crontrol.
  • Используется кэширование, из-за которого запрос не актуален.

Удаляются не те заказы или слишком много

  • Неправильно задан параметр даты в date_query.
  • Используется posts_per_page больше допустимого — при большом количестве заказов лучше делать удаление пакетами.

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

  • Запускайте удаление в ночное время с низкой нагрузкой.
  • Делайте удаление партиями по 100–200 заказов, чтобы не перегрузить сервер.
  • Используйте транзакции базы данных при сложных операциях.
  • Перед удалением учитывайте связанные данные — например, платежные данные, мета-поля и т. д.
  • Регулярно создавайте резервные копии базы данных.

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

МетодПлюсыМинусыКомпромисс
Самописный код + wp-cronГибкость, контроль, без сторонних плагиновТребует навыков, возможны ошибки в запросахПроверять на тестовом сайте
Плагины очистки базы (например, WP Rocket, Clearfy)Простота, готовая функциональностьМогут удалять лишнее, нагрузка на серверИспользовать с осторожностью, тестировать
Удаление вручную в админке WooCommerceПростота, контрольТребуется время, не автоматичноИспользовать для мелких магазинов
WooCommerce: решение проблемы с отключением AJAX при обновлении корзины
07.06.2026
Отладка и оптимизация загрузки библиотек в WordPress
30.12.2025
Как создать автоматический импорт контента из внешних источников в WordPress
13.01.2026
Как создать многоуровневую навигацию в WordPress с примерами кода
18.02.2026
Как безопасно выполнять пользовательский PHP код в WordPress
21.03.2026