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

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

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

Диагностика проблемы

Чтобы убедиться в необходимости автоматического удаления заказов:

  • Проверьте размер таблиц wp_posts и wp_postmeta с типом записи shop_order.
  • Оцените количество заказов с нужным статусом, например, "cancelled" или "failed" старше 30 дней:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

Если количество большое (сотни и более), стоит задуматься об автоматическом удалении.

Решение: создание WP-Cron задачи для удаления заказов по статусу и дате

Реализуем функцию, которая будет запускаться по расписанию, искать заказы с указанным статусом и датой старше N дней, и удалять их вместе со всеми метаданными.

Шаг 1: регистрация cron задачи

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

Шаг 2: реализация функции удаления заказов

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

    $status = 'wc-cancelled'; // статус заказов для удаления
    $days_old = 30; // количество дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} 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
    ));

    if (empty($order_ids)) {
        return;
    }

    foreach ($order_ids as $order_id) {
        // Используем WC_Order для правильного удаления
        $order = wc_get_order($order_id);
        if ($order) {
            wp_delete_post($order_id, true); // true - принудительное удаление без перемещения в корзину
        }
    }
});

Шаг 3: отмена cron при деактивации плагина

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

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

  • Выполните вручную запуск cron задачи через WP-CLI или специальный плагин для тестирования cron:
    wp cron event run custom_delete_old_orders_event
  • Проверьте, что заказы с указанным статусом и датой удаления отсутствуют в базе:
    SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY); — должен возвращаться 0.
  • Отследите логи сервера и ошибок WordPress на предмет исключений.

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

  • Неправильный статус заказа: В WooCommerce статусы заказов имеют префикс wc-. Например, отменённый заказ имеет статус wc-cancelled. Без префикса запросы не найдут нужные заказы.
  • Удаление не всех метаданных: Используйте wp_delete_post с параметром true, чтобы удалить пост и все связанные данные. Самостоятельное удаление из таблиц может привести к остаткам данных.
  • Cron не запускается: Убедитесь, что в системе посещений сайта есть трафик или используйте системный cron для запуска WP-Cron. Проверьте наличие задачи через WP-CLI:
    wp cron event list
  • Удаление заказов, которые не следует трогать: Убедитесь, что фильтры по статусу и дате точно соответствуют нужным заказам, чтобы не потерять активные данные.

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

  • Запланируйте удаление на ночное время с минимальной нагрузкой.
  • Если заказов очень много, обрабатывайте их партиями, например, по 50-100, чтобы не превышать лимиты PHP-скрипта.
  • Логируйте удалённые ID заказов в отдельный файл для аудита.
  • Регулярно делайте бэкапы базы данных перед автоматическим удалением.

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

МетодПлюсыМинусы
Удаление через WP-Cron и wp_delete_postКорректное удаление всех связанных данных, легко настроить, интегрировано с WordPressЗависит от корректной работы WP-Cron, может создавать нагрузку при больших объёмах
Ручное удаление через SQL-запросыМгновенный эффект, можно удалить сразу много заказовРиск повредить данные, требует точных запросов, не удаляет связанные метаданные автоматически
Плагины автоматизацииУдобный интерфейс, дополнительные функции (логирование, фильтры)Дополнительная нагрузка, возможные конфликты, платные версии
Как избежать конфликтов между WooCommerce и плагинами кеширования
21.05.2026
Как создать автоматический отчет по ошибкам в WordPress
07.04.2026
Как создать автоматическое резервное копирование базы данных в WordPress
07.01.2026
WooCommerce: автоматическое удаление заказов по статусу и дате в 2024
01.07.2026
Автоматическая регистрация пользователей в WordPress: как настроить и автоматизировать процесс
02.12.2025