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

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

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

Как проверить, что заказы нуждаются в удалении

  • Откройте админ-панель WooCommerce → Заказы;
  • Отфильтруйте по статусу, например, «Отменён» или «Ожидает оплаты»;
  • Проверьте количество заказов и дату их создания;
  • Если старая куча заказов с этими статусами более не актуальна, стоит настроить автоматическое удаление.

Пошаговое решение: автоматическое удаление заказов по статусу с помощью WP-Cron

1. Создайте функцию для удаления заказов по статусу

function wpapp_delete_orders_by_status( $status = 'cancelled', $days_old = 30 ) {
    if ( ! class_exists( 'WC_Order_Query' ) ) {
        return;
    }

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

    $args = [
        'status' => $status,
        'limit'  => -1,
        'date_created' => '<' . $date_threshold,
        'return' => 'ids',
    ];

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // true — безвозвратно
    }
}

2. Создайте событие WP-Cron для регулярного запуска

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

add_action( 'wpapp_daily_order_cleanup', function() {
    // Удаляем отменённые заказы старше 30 дней
    wpapp_delete_orders_by_status( 'cancelled', 30 );

    // Можно добавить другие статусы при необходимости
    // wpapp_delete_orders_by_status( 'failed', 60 );
});

Проверка результата

  • Зайдите в базу данных и выполните запрос SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);. Если количество равно нулю — удаление сработало.
  • Проверьте раздел Заказы в админке WooCommerce: старые отменённые заказы исчезли.
  • Для отладки можно временно добавить логирование в функцию через error_log() или использовать плагин Query Monitor для мониторинга cron-задач.

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

  • Заказы не удаляются: Проверьте, активна ли WP-Cron и не блокируется ли она плагинами кеширования или сервером.
  • Удаляются не те заказы: Убедитесь, что статус заказа указан правильно — в WooCommerce статусы начинаются с префикса wc- в базе данных (например, wc-cancelled), но в API для wc_get_orders указывайте без wc-.
  • Удаление занимает много времени: Если заказов очень много, разбивайте удаление на партии, например, лимит 50 за раз и запускайте cron чаще.

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

  • Для предотвращения случайного удаления рекомендуем запускать удаление только для заказов старше определённого срока (30+ дней).
  • Не используйте wp_delete_post($order_id, false) — это поместит заказ в корзину и не освободит место в базе.
  • Перед массовым удалением сделайте резервную копию базы данных.
  • Если на сайте высокий трафик, WP-Cron может не сработать вовремя — рассмотрите запуск cron-задач через системный cron на сервере.
  • Для расширенной настройки очистки можно добавить параметры для выбора статусов и периода через панель администратора (требуется разработка UI).

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

МетодПреимуществаНедостаткиРекомендации
Код на WP-Cron (как в статье) Гибкость, бесплатный, легко адаптируемый Зависит от работы WP-Cron, требует навыков разработки Для разработчиков и сайтов с небольшой нагрузкой
Плагины очистки заказов (например, WP Bulk Delete) Удобный интерфейс, дополнительные функции Часто платные, возможны конфликты Для пользователей без навыков программирования
Ручное удаление через админку Простота, не требует настройки Трудоёмко при большом количестве заказов Только для небольших сайтов

Наш каталог плагинов WordPress