Как сделать автоматическое удаление заказов WooCommerce после 30 дней

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

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

Часто пользователи задаются вопросом, как реализовать такую очистку без сторонних плагинов, чтобы гибко настраивать логику и не нагружать сайт дополнительным софтом.

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

  • В базе данных wp_posts таблица хранит заказы с типом shop_order.
  • Дата создания заказа хранится в поле post_date.
  • Удалять нужно только завершённые или отменённые заказы (статусы completed, cancelled, refunded), чтобы не потерять важные активные заказы.

Пошаговое решение: автоматическое удаление заказов старше 30 дней через WP-Cron

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

function wpacademy_delete_old_woocommerce_orders() {
    global $wpdb;
    $days = 30;
    $cutoff_date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID заказов, которые старше $days и имеют нужный статус
    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
        WHERE post_type = 'shop_order' 
        AND post_date < %s 
        AND post_status IN ('wc-completed', 'wc-cancelled', 'wc-refunded')",
        $cutoff_date
    ));

    if (!empty($order_ids)) {
        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление
        }
    }
}

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

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

add_action('wpacademy_daily_order_cleanup', 'wpacademy_delete_old_woocommerce_orders');

3. Добавляем возможность отключать задачу для тестирования

// Для удаления задачи (например, при деактивации плагина или темы)
function wpacademy_clear_order_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wpacademy_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpacademy_daily_order_cleanup');
    }
}
// Вызывать при необходимости
// wpacademy_clear_order_cleanup_schedule();

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

  • Создайте тестовые заказы с датой старше 30 дней и статусом wc-completed.
  • Запустите функцию вручную, вызвав wpacademy_delete_old_woocommerce_orders() из консоли WP-CLI или временно вызвав её в коде.
  • Проверьте, что заказы удалились из админки WooCommerce и таблицы wp_posts.
  • Для проверки работы WP-Cron можно использовать плагин WP Crontrol, чтобы вручную запустить событие wpacademy_daily_order_cleanup.

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

  • Заказы не удаляются: проверьте, что статусы заказов указаны правильно с префиксом wc- (например, wc-completed), а не просто completed.
  • WP-Cron не запускается: на некоторых серверах WP-Cron отключён, необходимо настроить реальный cron-задание или запускать WP-Cron вручную.
  • Удаление не полное: используйте wp_delete_post($order_id, true) для полного удаления вместе с метаданными, иначе заказ останется в базе.
  • Проблемы с производительностью при большом количестве заказов: реализуйте удаление партиями (например, по 100 заказов за раз) с использованием OFFSET и LIMIT в SQL-запросе.

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

  • Перед автоматическим удалением сделайте резервную копию базы, чтобы избежать потери данных.
  • Ограничьте удаление только завершёнными и отменёнными заказами, чтобы не потерять активные транзакции.
  • Если база очень большая, используйте WP-CLI для запуска удаления в фоне, чтобы избежать таймаутов PHP.
  • Регулярно проверяйте логи ошибок сервера и WooCommerce для своевременного выявления проблем с удалением.
  • Для удобства и расширенного контроля используйте плагин Clearfy Pro с функциями очистки и оптимизации WooCommerce.

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

МетодПреимуществаНедостатки
Ручное удаление в админкеПростота, контрольТрудоемко, невозможно для большого объема
Плагины авточисткиАвтоматизация, настройки безопасностиНагрузка на сайт, возможные конфликты
WP-Cron с кастомным кодомГибкость, без сторонних плагиновЗависит от WP-Cron, требует знаний PHP
Как автоматизировать удаление неработающих шорткодов в WordPress
11.03.2026
Как создать настройку для отключения кэша в WordPress
31.12.2025
Как создать автоматический импорт данных из Google Sheets в WordPress
09.02.2026
Автоматическое удаление завершённых заказов WooCommerce через PHP
05.06.2026
Как добавить поддержку WebP в WordPress без плагинов
23.12.2025