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

Почему стоит настраивать автоматическое удаление заказов по статусу в WooCommerce?

В магазинах на WooCommerce со временем накапливаются заказы с различными статусами: отменённые, отклонённые, ожидающие оплаты и т.д. Если не очищать такие заказы, база данных разрастается, что может замедлить работу сайта и усложнить управление заказами.

Автоматическое удаление заказов с определённым статусом помогает поддерживать базу в порядке и снижать нагрузку на сервер.

Диагностика: как понять, что накопилось много лишних заказов?

  • Проверьте количество заказов по статусам в WooCommerce → Заказы → Фильтры по статусу.
  • Подключитесь к базе данных через phpMyAdmin и выполните запрос:
SELECT post_status, COUNT(ID) as total FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

Если количество заказов с статусом wc-cancelled, wc-failed или wc-pending значительно превышает активные, имеет смысл настроить автоматическое удаление.

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

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

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

function wpstart_delete_orders_by_status( $status = 'wc-cancelled', $days_old = 30 ) {
    $args = array(
        'post_type' => 'shop_order',
        'post_status' => $status,
        'date_query' => array(
            array(
                'column' => 'post_date',
                'before' => "$days_old days ago",
            ),
        ),
        'fields' => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts( $args );

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

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }

    return count( $orders );
}

2. Настраиваем запуск через WP-Cron

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

// Регистрация события при активации темы или плагина
function wpstart_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wpstart_weekly_order_cleanup' ) ) {
        wp_schedule_event( time(), 'weekly', 'wpstart_weekly_order_cleanup' );
    }
}
add_action( 'wp', 'wpstart_schedule_order_cleanup' );

// Хук для выполнения очистки
add_action( 'wpstart_weekly_order_cleanup', function() {
    $deleted = wpstart_delete_orders_by_status( 'wc-cancelled', 30 ); // Удаляем отменённые заказы старше 30 дней
    error_log( "WooCommerce: удалено заказов со статусом wc-cancelled - $deleted" );
});

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

  • Посмотрите логи PHP (error_log), чтобы убедиться, что функция запускается и удаляет заказы.
  • Перейдите в WooCommerce → Заказы и проверьте, что заказы с указанным статусом и датой старше 30 дней действительно отсутствуют.
  • Можно временно изменить период удаления (например, на 1 день), чтобы быстро проверить работу.

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

  • Отсутствие запланированного события WP-Cron: убедитесь, что на сайте работают WP-Cron события (не отключены в wp-config.php). Для отладки можно использовать плагин WP Crontrol.
  • Неправильный статус заказа: статусы WooCommerce всегда начинаются с wc-. Проверяйте точное имя статуса через админку или базу данных.
  • Удаление не происходит: возможно, недостаточно прав у PHP процесса или функция wp_delete_post не вызывается. Проверьте ошибки в логе.

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

  • Удаление заказов происходит с принудительным удалением (wp_delete_post($id, true)), что убирает запись из базы полностью. Убедитесь, что данные резервируются, если нужны для отчётов.
  • Для сайтов с большим количеством заказов лучше разбивать удаление на части (например, по 100 заказов за раз), чтобы избежать таймаутов.
  • Используйте плагин Clearfy Pro для дополнительной оптимизации базы и удаления устаревших данных, если хотите упростить управление.

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

МетодПлюсыМинусы
Ручное удаление через админку WooCommerceПросто, не требует кодаНужно много времени при большом объёме заказов
WP-Cron + пользовательский код (описанный способ)Автоматизация, гибкость настройкиТребует базовых навыков разработки
Плагины для оптимизации базы (например, Clearfy Pro)Интегрированное решение, дополнительные инструментыПлатные решения, может быть избыточно
Как отключить XML-RPC в WordPress и не сломать нужные интеграции
18.08.2026
Как отключить эмодзи в WordPress через код и плагин
21.08.2026
Как закрыть дубли страниц от индексации в WordPress
14.08.2026
Как отключить XML-RPC в WordPress и оставить нужные запросы
24.08.2026