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

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

В магазинах на WooCommerce с большим объемом заказов может возникать необходимость автоматически удалять заказы с определенным статусом, например, отмененные или просроченные. Это помогает поддерживать базу данных в чистоте, ускоряет работу админки и снижает нагрузку на сервер.

Чаще всего удаление нужно для статусов cancelled, failed или кастомных статусов, которые не влияют на аналитику и не должны храниться долго.

Как определить заказы для удаления: выбор статусов и дата

Для автоматизации важно точно определить, какие заказы удалять, и с каким лагом по времени. Например, удалять заказы со статусом cancelled, которым больше 30 дней.

Для проверки используйте SQL-запрос:

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

Если в ответе есть записи, значит заказы подходят под условие и готовы к удалению.

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

1. Добавьте в файл functions.php вашей темы или в отдельный плагин следующий код для регистрации задачи WP-Cron:

if (!wp_next_scheduled('auto_delete_wc_orders')) {
    wp_schedule_event(time(), 'daily', 'auto_delete_wc_orders');
}

add_action('auto_delete_wc_orders', 'auto_delete_wc_orders_callback');

function auto_delete_wc_orders_callback() {
    global $wpdb;

    $status = 'wc-cancelled'; // статус заказов для удаления
    $days = 30; // удалять заказы старше 30 дней

    $date_limit = 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_limit
    ));

    if (empty($order_ids)) {
        return; // заказы не найдены
    }

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

2. Для тестирования вызовите функцию вручную, например, через add_action('init', 'auto_delete_wc_orders_callback'); на короткое время.

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

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

  • Заказы со статусом cancelled старше 30 дней должны исчезнуть.
  • В логах сервера или WP_DEBUG (если включен) не должно быть ошибок.
  • Для проверки SQL-запроса можно повторить запрос из раздела диагностики — он должен вернуть пустой результат по удаленным заказам.

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

  • Заказы не удаляются: проверьте, что WP-Cron работает на вашем хостинге, или запустите задачу вручную.
  • Статусы не совпадают: WooCommerce добавляет префикс wc- к статусам заказов, например, wc-cancelled. Убедитесь, что используете полный статус.
  • Удаление не происходит из-за кеширования: некоторые кеш-плагины могут мешать обновлению данных. Очистите кешы и проверьте повторно.
  • Нехватка прав: функция wp_delete_post требует прав администратора, но при запуске с WP-Cron она выполняется от имени сервера. Обычно проблем не возникает, но при кастомных политиках безопасности проверьте права доступа.

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

  • Удаляйте заказы только после того, как уверены, что они не понадобятся для отчетности или восстановления.
  • Включите логирование работы задачи, чтобы отслеживать, сколько заказов удаляется и не возникает ли ошибок.
  • Если заказов очень много, разбивайте удаление на партии, чтобы избежать таймаутов и нагрузки.
  • Периодичность запуска WP-Cron можно изменить с daily на twicedaily или hourly, если это оправдано.

Таблица сравнения способов удаления заказов

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаЗанимает время, не подходит для большого объема заказов
Код с WP-Cron (описанный выше)Автоматизация, гибкая настройка, минимальная нагрузкаТребует базовых знаний PHP и доступа к коду
Плагины для очистки базыУдобный интерфейсМожет влиять на производительность, не всегда гибко
Автоматический импорт данных из внешнего API в WordPress
02.04.2026
Как удалить старые изображения в WordPress без плагинов
19.01.2026
Как автоматизировать удаление старого контента в WordPress по дате публикации
11.04.2026
Как добавить поддержку WebP в WordPress без плагинов
25.02.2026
Как удалить неактивных пользователей в WordPress: эффективные методы и примеры
19.11.2025