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

Что такое неактивные заказы в WooCommerce и зачем их удалять

Неактивные заказы — это заказы, которые не были оплачены, отменены или находятся в состоянии ожидания оплаты длительное время. Такие заказы накапливаются в базе и могут замедлять работу сайта, особенно если их тысячи. Автоматическое удаление неактивных заказов помогает поддерживать базу данных в порядке и ускорять запросы WooCommerce.

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

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

  • Перейдите в WooCommerce > Заказы.
  • Отфильтруйте заказы по статусу отклонён, ожидает оплаты или отменён.
  • Посмотрите, сколько таких заказов и когда они были созданы.

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

Пошаговое решение: автоматизация удаления неактивных заказов через WP-Cron и код

Для автоматизации удаления добавим кастомный код в файл functions.php вашей темы или лучше в плагин-сниппет.

1. Создаём функцию для удаления заказов старше X дней с нужными статусами

function delete_inactive_wc_orders() {
    if ( ! class_exists( 'WC_Order_Query' ) ) {
        return;
    }

    $days = 30; // Кол-во дней для хранения заказов
    $statuses = array( 'pending', 'failed', 'cancelled' );

    $date = new DateTime();
    $date->modify("-{$days} days");
    $date_string = $date->format('Y-m-d H:i:s');

    $query = new WC_Order_Query( array(
        'limit' => -1,
        'status' => $statuses,
        'date_created' => '<' . $date_string,
        'return' => 'ids',
    ) );

    $orders = $query->get_orders();

    foreach ( $orders as $order_id ) {
        wp_trash_post( $order_id ); // можно использовать wp_delete_post для полного удаления
    }
}

2. Регистрируем WP-Cron задачу для регулярного запуска

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

add_action( 'delete_inactive_wc_orders_hook', 'delete_inactive_wc_orders' );

3. Очистка задачи при деактивации

function unschedule_delete_inactive_orders() {
    $timestamp = wp_next_scheduled( 'delete_inactive_wc_orders_hook' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'delete_inactive_wc_orders_hook' );
    }
}
register_deactivation_hook( __FILE__, 'unschedule_delete_inactive_orders' );

Как проверить, что автоматическое удаление работает

  • Добавьте тестовый заказ с одним из статусов pending, failed или cancelled и датой создания старше 30 дней (можно вручную изменить дату в базе для теста).
  • Запустите WP-Cron вручную командой wp cron event run delete_inactive_wc_orders_hook через WP-CLI или дождитесь автоматического запуска.
  • Проверьте, что заказ переместился в корзину или удалён.
  • В админке WooCommerce проверьте, что такого заказа больше нет.

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

  • Заказы не удаляются: Убедитесь, что у вас включен WP-Cron. Если сайт малопосещаемый, WP-Cron может не запускаться — рассмотрите настройку системного cron на сервере.
  • Удаляются не те статусы: Проверьте массив $statuses, он должен содержать только нужные статусы. Например, не стоит включать completed или processing.
  • Удаление занимает много времени: При большом количестве заказов поставьте лимит в WC_Order_Query и запускайте удаление партиями.
  • Заказы не попадают в корзину, а вообще не удаляются: Функция wp_trash_post перемещает в корзину. Для полного удаления используйте wp_delete_post( $order_id, true ), но будьте осторожны — восстановить удалённые заказы нельзя.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Не используйте полный wp_delete_post без крайней необходимости.
  • Ограничьте частоту запуска cron задачи до одного раза в день, чтобы не перегружать сервер.
  • Если база слишком большая, разбейте удаление на партии по 100-200 заказов.
  • Добавьте логирование удалённых заказов для аудита, например, через error_log или запись в отдельную таблицу.

Сравнение вариантов автоматического удаления неактивных заказов

ВариантПлюсыМинусыПример
Плагин (например, Advanced Order Cleaner) Простота установки, поддержка интерфейса, настройки без кода Может быть тяжеловесным, ограниченные настройки, зависимость от плагина Advanced Order Cleaner
Кастомный код с WP-Cron Максимальный контроль, легковесность, можно адаптировать под любые условия Требуется базовое знание PHP и WP-Cron, нужна поддержка кода Код из статьи
Ручное удаление через SQL-запросы Быстро при единовременной очистке Риск повредить базу, нет автоматизации
DELETE FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < NOW() - INTERVAL 30 DAY;
Как использовать WP Rollback для отката версии плагинов в WordPress
07.06.2026
Удаление пустых шорткодов в WordPress: практическое руководство
17.02.2026
Как создать собственный виджет в WordPress
20.11.2025
WooCommerce: как автоматически удалять товары по статусу и дате
20.05.2026
Как избежать проблем с конфликтами плагинов в WordPress
22.03.2026