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

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

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

Как настроить автоматическое удаление неактивных заказов по срокам

Выбор статусов заказов для удаления

Прежде всего, нужно определить, какие статусы заказов считать неактивными и подлежащими удалению. Обычно это:

  • pending — ожидает оплаты;
  • failed — неудачный платеж;
  • cancelled — отменен.

Заказы со статусом completed или processing обычно сохраняются.

Пошаговое решение с примером кода

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

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

    $statuses = array( 'pending', 'failed', 'cancelled' ); // Статусы для удаления
    $days = 30; // Срок хранения заказов в днях

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

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

    $order_ids = $query->get_orders();

    if ( ! empty( $order_ids ) ) {
        foreach ( $order_ids as $order_id ) {
            wp_trash_post( $order_id ); // Помещаем заказ в корзину
            // Для полного удаления используйте wp_delete_post($order_id, true);
        }
    }
}

// Запускаем функцию раз в сутки с помощью WP Cron
add_action( 'wpsocial_daily_order_cleanup', 'wpsocial_delete_old_inactive_orders' );

// Планируем событие при активации темы/плагина
function wpsocial_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wpsocial_daily_order_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpsocial_daily_order_cleanup' );
    }
}
add_action( 'wp', 'wpsocial_schedule_order_cleanup' );

// Очищаем расписание при деактивации
function wpsocial_unschedule_order_cleanup() {
    $timestamp = wp_next_scheduled( 'wpsocial_daily_order_cleanup' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpsocial_daily_order_cleanup' );
    }
}
// Добавьте это в деактивацию плагина или темы
// register_deactivation_hook( __FILE__, 'wpsocial_unschedule_order_cleanup' );

Объяснение кода

  • Используем класс WC_Order_Query для выборки заказов по статусам и дате создания;
  • Удаляем заказы, которые старше 30 дней (значение можно изменить в переменной $days);
  • Для удаления используем wp_trash_post, чтобы можно было восстановить заказ из корзины при необходимости;
  • Планируем ежедневное выполнение задачи с помощью WP Cron.

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

  1. Создайте тестовый заказ с нужным статусом (например, pending) и датой создания более 30 дней назад. Для этого можно вручную изменить дату создания в базе данных или использовать плагин для редактирования заказов;
  2. Запустите запланированное событие вручную через WP-CLI:
    wp cron event run wpsocial_daily_order_cleanup;
  3. Проверьте, что заказ переместился в корзину (раздел "Заказы" -> "Корзина" в WooCommerce);
  4. Если хотите удалить навсегда, замените wp_trash_post на wp_delete_post в коде.

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

  • Код не выполняется: Убедитесь, что WP Cron работает на вашем сервере. Для отладки можно использовать плагин WP Crontrol;
  • Удаляются нужные заказы: Проверьте переменную $statuses — не включайте статусы, которые должны сохраняться;
  • Заказы не удаляются, хотя старше срока: Проверьте правильность формата даты и время сервера;
  • Удаление без возможности восстановления: Используйте wp_trash_post, чтобы сначала перемещать заказы в корзину, а не удалять навсегда.

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

  • Не удаляйте заказы сразу навсегда — сначала перемещайте их в корзину. Это безопаснее;
  • Для больших магазинов с тысячами заказов используйте пакетную обработку, чтобы избежать превышения лимита памяти или времени выполнения;
  • Проверяйте нагрузку на базу, планируя выполнение скрипта в ночное время;
  • Регулярно делайте резервные копии базы перед автоматическими удалениями;
  • Можно дополнительно логировать удаленные заказы, например, записывать ID и дату удаления в отдельный файл или таблицу.

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

МетодОписаниеПлюсыМинусы
Код на WP Cron (пример выше)Автоматическое удаление заказов по расписаниюГибкость, нет необходимости в плагинах, можно кастомизироватьТребует навыков программирования, зависит от работы WP Cron
Плагины очистки базыГотовые решения для удаления старых заказовПростота настройки, визуальный интерфейсМогут быть тяжелыми, не всегда гибкие, риск удаления лишнего
Ручное удаление через админкуУдаление заказов вручнуюБезопасно, полный контрольТрудоемко, не подходит для большого количества заказов
Как удалить или отключить отправку писем WordPress без плагинов
10.12.2025
Оптимизация изображений для WordPress: лучшие методы и плагины
10.11.2025
WP Social Login не работает: причины и решения
07.12.2025
Как отключить переадресацию в WordPress: практические решения
01.01.2026
Как автоматически удалять старые сообщения из комментариев WordPress
28.03.2026