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

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

При работе с WooCommerce накапливается множество заказов, которые не были оплачены или остались в состоянии ожидания длительное время. Такие «зависшие» заказы занимают место в базе данных, замедляют работу сайта и мешают аналитике. Особенно актуально для магазинов с большим потоком клиентов.

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

  • Большой объем таблиц wp_posts и wp_postmeta из-за заказов со статусом pending, failed или on-hold.
  • Замедленная работа админки при просмотре заказов.
  • Ошибки при резервном копировании из-за размера базы.

Как определить, какие заказы считать «неактивными»

Рекомендуется удалять заказы, которые находятся в статусах pending, failed или on-hold и не были обновлены в течение определенного времени (например, 30 дней). Статусы completed и processing обычно не трогаются.

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

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-on-hold') ORDER BY post_date ASC;

Это покажет все заказы, подходящие под критерии, с датой создания.

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

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

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

function wpdir_delete_old_inactive_orders() {
    $days = 30; // Количество дней для хранения заказов
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type' => 'shop_order',
        'post_status' => ['wc-pending', 'wc-failed', 'wc-on-hold'],
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // true — удаление без корзины
        }
    }
}

2. Запускаем функцию по расписанию (WP-Cron)

Добавьте в functions.php следующий код для регистрации и запуска задачи еженедельно:

// Регистрируем событие
if (!wp_next_scheduled('wpdir_weekly_delete_old_orders')) {
    wp_schedule_event(time(), 'weekly', 'wpdir_weekly_delete_old_orders');
}

// Хук на событие
add_action('wpdir_weekly_delete_old_orders', 'wpdir_delete_old_inactive_orders');

3. Ручной запуск для теста

Для проверки работы можно вызвать функцию вручную в админке или через WP-CLI:

wp eval 'wpdir_delete_old_inactive_orders();'

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

Проверьте через SQL или в админке WooCommerce, что заказы со статусами pending, failed, on-hold и датой создания старше 30 дней удалены.

SQL-запрос для проверки:

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

Если результат 0, значит удаление сработало.

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

  • Заказы не удаляются — проверьте, срабатывает ли WP-Cron. Для теста используйте плагин WP Crontrol, чтобы запустить событие вручную.
  • Удаляются заказы, которые нужны — внимательно проверьте статус заказов. WooCommerce добавляет префикс wc- к статусам в базе, поэтому в запросах это важно учитывать.
  • Удаление не полное — функция wp_delete_post с параметром true удаляет пост без перемещения в корзину, но метаданные могут остаться. В нашем случае они удаляются автоматически, так как это дочерние записи.

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

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

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

МетодПлюсыМинусыКомпромисс
Плагин (например, WP Bulk Delete)Простота настройки, интерфейсДополнительная нагрузка, ограниченная гибкостьИспользовать для небольших сайтов
Код в functions.php + WP-CronГибкость, минимальная нагрузкаТребует навыков разработки, настройка WP-CronЛучший вариант для опытных разработчиков
SQL-запросы напрямуюБыстрота, полное управлениеРиск удаления нужных данных, требует бэкаповИспользовать только с полной уверенностью
WooCommerce: автоматическое удаление товаров с отсутствующими атрибутами и вариациями
05.07.2026
Автообновление тем и плагинов в WordPress: настройка и контроль
02.12.2025
Как создать уникальный Metabox в WordPress с примером кода
23.12.2025
Как создать и использовать хлебные крошки в WordPress
11.02.2026
WooCommerce: автоматическое удаление товаров с нулевым остатком без плагинов
12.06.2026