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

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

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

Типичные признаки проблемы:

  • Замедленная загрузка страницы «Заказы» в админке WooCommerce.
  • Большой процент заказов со статусами pending, failed или cancelled.
  • Ошибки при генерации отчётов или статистики.

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

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

  • Статус заказа: pending, failed, cancelled.
  • Возраст заказа: например, старше 30 дней.
  • Дополнительные фильтры, например, исключение заказов с заметками или тегами.

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

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled') AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

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

1. Создание WP-CLI команды для удаления неактивных заказов

WP-CLI позволяет выполнять массовые операции через командную строку, что удобно для регулярной очистки.

if (defined('WP_CLI') && WP_CLI) {
    WP_CLI::add_command('wc-clean-orders', function() {
        $args = [
            'post_type'      => 'shop_order',
            'post_status'    => ['wc-pending', 'wc-failed', 'wc-cancelled'],
            'date_query'     => [
                [
                    'column' => 'post_date',
                    'before' => '30 days ago'
                ]
            ],
            'posts_per_page' => -1,
            'fields'         => 'ids',
        ];

        $orders = get_posts($args);
        if (empty($orders)) {
            WP_CLI::success('Нет неактивных заказов для удаления.');
            return;
        }

        foreach ($orders as $order_id) {
            wp_trash_post($order_id);
        }

        WP_CLI::success('Удалено заказов: ' . count($orders));
    });
}

2. Автоматизация через планировщик WP-Cron

Чтобы запускать очистку автоматически, регистрируем событие и хук:

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

function wc_cleanup_old_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-failed', 'wc-cancelled'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '30 days ago'
            ]
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $orders = get_posts($args);
    foreach ($orders as $order_id) {
        wp_trash_post($order_id);
    }
}
add_action('wc_cleanup_old_orders', 'wc_cleanup_old_orders');

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

  • Запустите WP-CLI команду вручную: wp wc-clean-orders и проверьте результат.
  • Проверьте в админке WooCommerce, что заказы со статусами pending, failed, cancelled старше 30 дней переместились в корзину.
  • Посмотрите статистику загрузки страницы заказов до и после.
  • Убедитесь, что активные заказы не тронуты.

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

  • Удаление активных заказов: Неправильный фильтр статуса или даты может привести к удалению важных заказов. Используйте точные статусы с префиксом wc- и проверяйте даты.
  • Проблемы с производительностью при большом количестве заказов: Выполняйте удаление пакетами, добавьте posts_per_page 100 и обрабатывайте несколько циклов.
  • Отсутствие WP-Cron запуска: По умолчанию WP-Cron срабатывает при посещениях сайта. Для сайтов с низкой посещаемостью настройте системный cron или используйте плагины для запуска WP-Cron.
  • Заказы не удаляются сразу: Функция wp_trash_post() перемещает заказ в корзину. Для полного удаления используйте wp_delete_post($order_id, true);, но будьте осторожны.

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Для больших магазинов разбейте операцию удаления на части, чтобы не перегружать сервер.
  • Используйте транзакции базы данных, если пишете сложный SQL для удаления.
  • Регулярно очищайте корзину заказов — WooCommerce не удаляет их автоматически.
  • Логируйте результаты автоматической очистки для последующего анализа.

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

МетодПреимуществаНедостатки
WP-CLI командаПрямой контроль, быстрое выполнение, подходит для больших базНужен доступ к серверу, не автоматизирован без cron
WP-Cron хукАвтоматизация, не требует ручного вмешательстваЗависит от посещаемости сайта, ограничена временем выполнения
Плагины (например, Clearfy Pro)Простота использования, расширенные настройки, поддержкаДополнительная нагрузка, возможны конфликты
Автоматическое создание копий постов в WordPress с помощью кода
28.01.2026
Автоматическое удаление неактивных пользователей WooCommerce
25.04.2026
Как настроить автоматическую обработку формы обратной связи в WordPress
11.04.2026
Как добавить собственные типы постов в WordPress с примерами
03.12.2025
Автоматическая оптимизация базы данных WordPress: лучшие практики и примеры кода
11.11.2025