Автоматическое удаление заказов WooCommerce старше 30 дней

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

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

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

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

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

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

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

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

2. Регистрация WP-Cron задачи

Для автоматического запуска функции регулярно зарегистрируем событие cron. В данном примере — запуск один раз в сутки:

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

add_action('wporders_daily_delete_old_orders', 'wporders_delete_old_completed_orders');

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

Чтобы не оставлять висячие задачи, добавьте удаление cron при деактивации плагина или отключении темы:

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

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

  • Запустите функцию вручную, вызвав wporders_delete_old_completed_orders() через консоль WP-CLI или временный вызов в коде.
  • Проверьте, что заказы старше 30 дней со статусом wc-completed удалены из базы (таблица wp_posts и wp_postmeta).
  • Убедитесь, что WP-Cron задача добавлена: wp cron event list в WP-CLI или через плагин Query Monitor.
  • Через сутки проверьте, что новые старые заказы тоже удаляются автоматически.

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

  • Функция не запускается по расписанию: убедитесь, что WordPress Cron работает. На локальных серверах часто cron не срабатывает без посещения сайта. Для теста вызовите функцию вручную.
  • Удаляются не те заказы: проверьте корректность условия post_status = 'wc-completed'. Статусы могут быть кастомными, учитывайте их в запросе.
  • Удаление не полное: wp_delete_post($order_id, true) удаляет заказ и метаданные. Если остались записи, проверьте сторонние плагины, которые могут создавать связи.
  • Проблемы с производительностью при большом количестве заказов: разбивайте удаление на части, используя лимит в SQL и циклы.

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

  • Перед удалением делайте резервное копирование базы данных.
  • Для больших магазинов используйте пакетную обработку, например, удалять по 100 заказов за раз.
  • Учитывайте, что удаление заказов может повлиять на отчёты и аналитику, убедитесь, что это приемлемо.
  • Контролируйте доступ к функциям удаления, не давайте запускать их неавторизованным пользователям.

Сравнение вариантов реализации удаления заказов

МетодПлюсыМинусыПример
WP-Cron + wp_delete_postПростота, интеграция с WordPressЗависит от трафика, медленнее для большого объёмаКод из статьи
SQL-запросы напрямуюБыстрее при больших объёмахРиск повреждения данных, сложность поддержки
DELETE FROM wp_posts WHERE post_type='shop_order' AND post_status='wc-completed' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);
Плагины очистки базыУдобство, интерфейсНе всегда гибко, может удалять лишнееWP-Optimize, Advanced Database Cleaner
Как создать настройки плагина в WordPress: пошаговое руководство с примерами кода
01.10.2026
WooCommerce: как реализовать авторизацию пользователя по номеру заказа
02.10.2026
Как сделать автоматическое создание отчета по заказам в WordPress без WooCommerce
02.10.2026
Как закрыть от индексации страницы фильтров и параметров в WordPress
09.09.2026
Оптимизация заказов в WordPress WooCommerce: практические советы и примеры кода
01.10.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее