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

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

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

Как определить, какие заказы подлежат удалению

Для автоматизации важно чётко определить критерии отбора:

  • Статусы заказов: например, "cancelled", "failed" или "pending"
  • Возраст заказа: например, старше 30 дней
  • Дополнительные условия (опционально): отсутствие оплаты, отсутствие связи с пользователем и т.п.

Пошаговое решение: автоматизация удаления заказов через WP-Cron и WP_Query

Реализуем функцию, которая будет еженощно запускаться и удалять заказы с нужными параметрами.

1. Регистрируем событие WP-Cron

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

2. Добавляем функцию удаления заказов

add_action('wpteam_woocommerce_clean_old_orders', function() {
    $days = 30; // удаляем заказы старше 30 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-cancelled', 'wc-failed', 'wc-pending'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ]
        ],
        'posts_per_page' => 100, // лимит на один проход
        'fields'         => 'ids',
    ];

    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление
        }
    }

    wp_reset_postdata();
});

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

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

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

Чтобы убедиться, что удаление работает:

  • Запустите вручную событие через do_action('wpteam_woocommerce_clean_old_orders'); в functions.php или через консоль WP-CLI.
  • Проверьте в админке WooCommerce заказы с нужным статусом и датой — они должны исчезнуть.
  • Отслеживайте логи сервера или создайте логирование в функции удаления для контроля.

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

  • Не удаляются заказы: проверьте правильность статусов — WooCommerce использует "wc-" префиксы.
  • Функция не запускается по расписанию: убедитесь, что WP-Cron работает (проверить через плагин WP Crontrol).
  • Удаление не полное: используйте wp_delete_post($order_id, true); для принудительного удаления, иначе заказ может попасть в корзину.
  • Высокая нагрузка при большом количестве заказов: уменьшите posts_per_page и настройте повторный запуск через несколько минут.

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

  • Не используйте слишком частый запуск задачи — достаточно 1 раз в сутки.
  • Перед удалением можно делать резервную копию базы или экспорт заказов.
  • Для больших магазинов лучше делать удаление порциями с постепенным увеличением даты.
  • Логируйте действия в отдельный файл, чтобы быстро выявлять ошибки.

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

МетодПлюсыМинусы
Плагины очистки заказовПростота установки, дополнительные настройкиНагрузка, дополнительный вес, возможные конфликты
Код на WP-Cron (пример выше)Лёгкий, контролируемый, без лишних плагиновТребует навыков разработки и тестирования
Ручное удаление через админкуПростота и безопасностьТрудозатратно, не автоматизировано
Как правильно добавить noindex для отдельных страниц WordPress
16.12.2025
Как установить и настроить WPCommunity для создания форума в WordPress
07.01.2026
Как сделать автоматический импорт постов в WordPress из RSS
27.02.2026
Автоматическое отключение плагинов при возникновении ошибок в WordPress
08.04.2026
WooCommerce: автоматическое удаление товаров по сроку с помощью кода
26.05.2026