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

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

В интернет-магазине на WooCommerce со временем накапливаются тысячи заказов, включая отменённые, завершённые и неактивные. Такие данные могут замедлять работу сайта, увеличивать размер базы данных и усложнять администрирование. Автоматическое удаление заказов по статусу и дате помогает удерживать базу в оптимальном состоянии без ручного контроля.

Типичные сценарии:

  • Удалять отменённые заказы старше 30 дней.
  • Удалять завершённые заказы, если они не нужны для отчетности и старше 1 года.
  • Удалять заказы с определённым статусом, например, "ожидает оплаты" старше 14 дней.

Как проверить, что автоматическое удаление заказов действительно необходимо

Перед внедрением решения проверьте, сколько заказов по конкретным статусам и возрасту хранится в базе. Для этого можно выполнить SQL-запрос к базе данных или использовать WP CLI:

wp db query "SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;"

Также важно проверить, нет ли юридических или бухгалтерских требований к хранению заказов в течение определённого периода.

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

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

function wpcore_delete_orders_by_status_and_date() {
    global $wpdb;
    $statuses_to_delete = [
        'wc-cancelled',   // Отменённые заказы
        'wc-failed'       // Неудачные
    ];
    $days_threshold = 30; // Удалять заказы старше 30 дней

    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_threshold} days"));

    foreach ($statuses_to_delete 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_threshold
        ));

        if (!empty($order_ids)) {
            foreach ($order_ids as $order_id) {
                wp_delete_post($order_id, true); // Полное удаление с метаданными
            }
        }
    }
}

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

add_action('wpcore_delete_old_orders_cron', 'wpcore_delete_orders_by_status_and_date');

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

3. Добавляем деактивацию крон-задачи при деактивации темы или плагина

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

Как проверить, что удаление работает корректно

  • Запустите функцию вручную (например, вызвав wpcore_delete_orders_by_status_and_date() в тестовой среде) и проверьте, что заказы с нужными статусами и датами исчезли из базы.
  • Проверьте список заказов в админке WooCommerce до и после запуска задачи.
  • Включите логирование удаления для отладки, добавив error_log() с ID удаляемых заказов.
  • Убедитесь, что не удаляются заказы с другими статусами и молодые по дате.

Частые ошибки и как их избежать

  • Использование неправильного статуса заказа: WooCommerce использует префикс wc- для статусов. Например, wc-completed, а не просто completed. Проверьте статусы через wp_posts перед удалением.
  • Удаление без резервной копии: Обязательно создавайте резервные копии базы данных перед внедрением автоматического удаления.
  • Неправильное время запуска WP Cron: На некоторых серверах WP Cron может не запускаться автоматически без посещений сайта. Для гарантии используйте системный cron или плагин WP Crontrol для проверки расписания.
  • Удаление заказов с активными платежами или важной информацией: Уточните бизнес-логику, чтобы не потерять нужные данные.

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

  • Используйте wp_delete_post($id, true) для полного удаления с метаданными и связями.
  • Для больших магазинов делайте удаление партиями, например, по 100 заказов за один запуск, чтобы не перегружать сервер.
  • Добавьте проверку nonce и прав пользователя, если планируете запускать удаление через интерфейс.
  • Используйте отдельный cron-задание с периодом не чаще чем раз в сутки, чтобы не создавать лишнюю нагрузку.
  • Если вам нужен более гибкий инструмент, рассмотрите WPShop Clearfy Pro для оптимизации базы и удаления дублей заказов, с интеграцией UTM для поддержки сайта.

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

МетодПлюсыМинусыРекомендации
Ручное удаление через админкуПростота, безопасностьМного времени, неудобно при большом объёмеИспользовать для единичных случаев
Плагины автоматизации (например, WPShop Clearfy Pro)Удобный интерфейс, дополнительные функцииМожет влиять на производительность, зависит от обновленийПодходит для магазинов с большой базой заказов
Кастомный код с WP Cron (как в статье)Полный контроль, нет сторонних зависимостейТребует навыков разработки, нужно тестироватьОптимально для разработчиков и уникальных бизнес-процессов
Как удалить авторизацию по email в WordPress и разрешить вход только по логину
19.03.2026
Как удалить неактивных пользователей WordPress с помощью скрипта
17.01.2026
Как быстро удалить пустые термины в WordPress
04.02.2026
Как создать автоматический импорт из CSV в WordPress
10.01.2026
WooCommerce: автоматическое удаление неактивных вариаций товаров
31.05.2026