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

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

Неактивные заказы (статусы «отменён», «ожидает оплаты» или «обработка», если долго не меняются) накапливаются и могут загромождать базу данных, замедлять админ-панель и влиять на отчёты. Автоматизация удаления таких заказов помогает поддерживать чистоту данных и улучшить производительность магазина.

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

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

  • Заказы в статусе «ожидает оплаты» (pending) старше 7 дней
  • Заказы в статусе «отменён» (cancelled) старше 30 дней
  • Заказы со статусом «обработка» (processing), если не изменялись более 60 дней — могут быть зависшими

Для проверки можно использовать SQL-запрос:

SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-cancelled', 'wc-processing');

И оценить даты создания заказов. Если есть большое количество «старых» заказов, стоит их очистить.

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

1. Добавление cron-задачи для регулярного удаления

Лучше всего запускать очистку автоматически, например, раз в сутки. Для этого добавим кастомное событие в WP-Cron.

add_action('init', function() {
    if (!wp_next_scheduled('woocommerce_cleanup_old_orders')) {
        wp_schedule_event(time(), 'daily', 'woocommerce_cleanup_old_orders');
    }
});

2. Написание функции очистки заказов

Функция удалит заказы по заданным статусам и возрасту:

add_action('woocommerce_cleanup_old_orders', function() {
    global $wpdb;

    $statuses = [
        'wc-pending' => 7,       // 7 дней
        'wc-cancelled' => 30,    // 30 дней
        'wc-processing' => 60    // 60 дней
    ];

    foreach ($statuses as $status => $days) {
        $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
        
        // Получаем ID заказов по статусу и дате
        $order_ids = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            $status, $date_threshold
        ));

        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление без перемещения в корзину
        }
    }
});

3. Очистка cron-задачи при деактивации темы или плагина

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

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

Чтобы убедиться, что удаление работает:

  • Вручную запустите событие cron с помощью плагина WP Crontrol или вызовите функцию напрямую.
  • Проверьте таблицу wp_posts на наличие старых заказов после запуска.
  • Убедитесь, что заказы удаляются только по заданным критериям.

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

  • Не удаляются заказы: Проверьте, что хуки и cron-события правильно зарегистрированы, а функция вызывается.
  • Удаляются лишние заказы: Проверьте правильность условий фильтрации по дате и статусу, убедитесь, что статусы указаны с префиксом wc-.
  • Производительность падает при удалении: Если заказов много, удаление лучше делать пакетно, например, по 50 штук за раз.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления, чтобы не оставлять мусор в базе.
  • Не запускайте очистку слишком часто — достаточно раз в сутки.
  • Если магазин большой, разбивайте удаление на части, используя LIMIT в SQL-запросах.
  • Резервируйте базу перед внедрением автоматического удаления.
  • Логируйте удалённые заказы в отдельный файл для аудита и отката.

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

МетодПлюсыМинусы
Ручное удаление через админку WooCommerceПростота
Нет кода
Трудозатратно
Риск пропуска
Плагины для очистки заказовАвтоматизация
Готовые настройки
Может замедлять сайт
Зависимость от сторонних разработчиков
Автоматическое удаление через кастомный код (WP-Cron)Гибкость
Контроль под себя
Без сторонних плагинов
Требует навыков кода
Риск ошибок без тестирования
Как создать автоматический анализ качества кода в WordPress
24.03.2026
Как создать и использовать REST API в WordPress: практическое руководство
22.11.2025
Как создать свой плагин для WordPress с использованием AI
30.11.2025
Автоматическое добавление метаданных к товарам в WooCommerce через код
18.05.2026
Автоматизация отчетности по работам на сайте WordPress с помощью AI
29.12.2025