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

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

Магазины на WooCommerce со временем накапливают большое количество заказов со статусом pending, failed или cancelled. Эти заказы не приносят дохода и могут замедлять работу сайта, увеличивать размер базы данных и усложнять отчетность. Особенно остро вопрос стоит на больших магазинах с сотнями и тысячами таких записей.

Если вы замечаете, что база данных WooCommerce раздувается, а в списке заказов много неактивных позиций, стоит рассмотреть автоматизацию их удаления. Это поможет оптимизировать производительность и сделать админ-панель чище.

Какие заказы считать неактивными?

Чаще всего под неактивными понимают заказы с такими статусами:

  • pending — заказ создан, но оплата не началась;
  • failed — оплата не прошла;
  • cancelled — заказ отменён пользователем или администратором;
  • on-hold — заказ на удержании, если он долго не меняет статус.

Их можно безопасно удалить, если они старше определённого времени (например, 30 дней). Это предотвращает удаление актуальных заказов.

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

1. Создаём функцию для удаления заказов старше N дней с указанными статусами

function wc_delete_old_inactive_orders() {
    $days = 30; // заказы старше 30 дней
    $statuses = array('pending', 'failed', 'cancelled');
    
    $date_query = array(
        'column' => 'post_date',
        'before' => "$days days ago",
    );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => $statuses,
        'date_query'     => array($date_query),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // принудительное удаление из базы
    }
}

2. Регистрируем WP-Cron для регулярного запуска

add_action('wc_delete_inactive_orders_event', 'wc_delete_old_inactive_orders');

function wc_schedule_delete_inactive_orders() {
    if (!wp_next_scheduled('wc_delete_inactive_orders_event')) {
        // Запускаем раз в день
        wp_schedule_event(time(), 'daily', 'wc_delete_inactive_orders_event');
    }
}
add_action('wp', 'wc_schedule_delete_inactive_orders');

3. Удаляем задачу при деактивации темы или плагина

function wc_unschedule_delete_inactive_orders() {
    $timestamp = wp_next_scheduled('wc_delete_inactive_orders_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_delete_inactive_orders_event');
    }
}
add_action('switch_theme', 'wc_unschedule_delete_inactive_orders'); // если в теме
// или add_action('deactivate_myplugin', 'wc_unschedule_delete_inactive_orders');

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

  • В административной панели WooCommerce перейдите в список заказов и примените фильтр по статусам pending, failed, cancelled. Проверьте, что заказы старше 30 дней отсутствуют.
  • Подключитесь к базе данных и выполните запрос для подсчёта заказов с указанными статусами и датой создания старше 30 дней:
    SELECT COUNT(*) 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);
    Значение должно быть равно нулю.
  • Для теста можете изменить значение $days на 0 и вручную создать тестовые заказы с нужным статусом и датой.

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает. На некоторых серверах он отключён. Можно использовать системный cron и команду WP-CLI или плагин WP Crontrol для диагностики.
  • Удаляются нужные заказы: Уточните фильтр даты и статусов. В WooCommerce статусы в базе хранятся с префиксом wc-. В get_posts и WP_Query достаточно указывать без префикса, но если удаление не срабатывает – попробуйте добавить. Или используйте метод wc_get_order_statuses() для проверки.
  • Производительность: При большом количестве заказов запрос может быть тяжёлым. Можно разделить удаление на порции через параметр posts_per_page и запускать несколько раз.

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

  • Перед удалением сделайте резервную копию базы данных, особенно если автоматизация запускается впервые.
  • Добавьте логирование удаляемых заказов в отдельный файл для аудита. Например, использовать error_log() или собственный файл.
  • Для больших магазинов лучше запускать удаление через системный cron и WP-CLI, чтобы избежать зависаний из-за ограничений PHP.
  • Проверяйте, что к удалению попадают только действительно неактивные заказы, чтобы не потерять данные клиентов.

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

МетодПлюсыМинусыРекомендации
WP-Cron с пользовательским кодомГибкость, бесплатное решениеЗависимость от посещаемости сайта, возможны задержкиПодходит для малых и средних магазинов
Системный cron + WP-CLIНадёжность, стабильное выполнениеТребует доступа к серверуЛучше для крупных магазинов
Плагины очистки базы (Clearfy Pro и др.)Удобство, готовые решенияМогут быть платными, не всегда гибкиеДля быстрого внедрения без кода

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как использовать REST API для создания уникальных эндпоинтов в WordPress
31.01.2026
Как создать свой шорткод в WordPress: подробное руководство
04.11.2025
Как добавить настройки в WordPress плагин: подробное руководство
10.11.2025
Как избежать проблем с бесконечными переадресациями в WordPress: практическое руководство
26.03.2026
Как создать уникальный фильтрованный список постов WordPress с пагинацией
23.03.2026
×

AI-плагин

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

SEO и мета-теги

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

Изображения

Комментарии

Подробнее