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

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

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

Если вы заметили, что в таблице wp_posts много записей с post_type = 'shop_order' и статусами wc-cancelled, wc-completed или wc-failed, и эти заказы уже не нужны для отчетности или аналитики, то автоматизация их удаления — актуальная задача.

Как определить заказы, подходящие для удаления

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

  • Заказы со статусом cancelled, которые старше N дней.
  • Заказы со статусом completed, которые уже не нужны для бухгалтерии или архива.
  • Заказы со статусом failed, которые не были оплачены и не имеют дальнейшего значения.

Важно согласовать этот список с бизнес-процессами.

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

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

function wpcore_delete_old_orders() {
    global $wpdb;
    $statuses = ['wc-cancelled', 'wc-completed', 'wc-failed'];
    $days_threshold = 30; // Удалять заказы старше 30 дней
    $date_limit = date('Y-m-d H:i:s', strtotime("-{$days_threshold} days"));

    foreach ($statuses as $status) {
        // Получаем 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)) {
            foreach ($order_ids as $order_id) {
                wp_delete_post($order_id, true); // Полное удаление, без перемещения в корзину
            }
        }
    }
}

2. Регистрируем событие Cron

add_action('wpcore_daily_order_cleanup', 'wpcore_delete_old_orders');

// Регистрируем Cron событие при активации темы/плагина
function wpcore_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpcore_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpcore_daily_order_cleanup');
    }
}
add_action('wp', 'wpcore_schedule_order_cleanup');

3. Добавляем очистку при деактивации

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

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

Для проверки:

  • Выполните функцию вручную (например, через wp shell или временно вызовите в теме): wpcore_delete_old_orders();
  • Проверьте, что в админке WooCommerce исчезли заказы с указанными статусами и датой старше порога.
  • Просмотрите таблицу wp_posts через phpMyAdmin или WP-CLI, убедитесь, что записи удалены.
  • Проверьте логи ошибок и отсутствие критических ошибок при запуске Cron.

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

  • Заказы не удаляются: Убедитесь, что Cron событие запущено (используйте плагин WP Crontrol для диагностики). Проверьте права пользователя, под которым работает WP.
  • Удаляются нужные заказы: Проверьте логику фильтрации даты и статусов. Возможно, нужно увеличить или уменьшить порог по дням.
  • Отсутствие прав на удаление: Если wp_delete_post не удаляет заказы, убедитесь, что пользователь имеет права на удаление заказов или используйте вызов с правами администратора.

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

  • Запускайте удаление в период низкой нагрузки, чтобы избежать просадок производительности.
  • Перед удалением создавайте резервные копии базы — это критично, если удаление по ошибке затрагивает важные данные.
  • Не удаляйте заказы, которые нужны для отчетности, бухгалтерии или аудита.
  • Используйте wp_schedule_event вместо системного Cron, чтобы избежать проблем с правами на сервере.
  • Если база очень большая, разбивайте удаление на порции по 100-200 заказов, чтобы избежать таймаутов PHP.

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

МетодПреимуществаНедостаткиУровень контроля
Плагин (например, WP Bulk Delete)Простота настройки, UI, поддержкаДополнительная нагрузка, лишний кодСредний
Код с Cron и wp_delete_post (как в статье)Полный контроль, легковесность, кастомизацияНужны навыки PHP, тестированиеВысокий
Ручное удаление через SQLОчень быстрое удалениеРиск повреждения данных, нет проверки зависимостейНизкий
Как использовать WPGPT для автоматического создания контента в WordPress
16.04.2026
Lazy loading для WordPress: как ускорить загрузку страниц и улучшить UX
01.02.2026
Как автоматизировать создание резервных копий в WordPress через Cron
18.12.2025
WooCommerce: как автоматически удалять неактивные вариации товаров по дате без плагинов
08.07.2026
Как использовать REST API для создания настроек в WordPress
08.12.2025