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

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

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

Какие заказы обычно удаляют автоматически

  • Отменённые (cancelled) и отклонённые (failed) заказы старше определённого срока.
  • Заказы в статусе ожидания оплаты (pending) или обработки (processing), которые не были завершены длительное время.
  • Тестовые или дубль-заказы, если они идентифицированы.

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

Реализуем удаление заказов, используя WP-Cron, без плагинов. Пример удаляет отменённые заказы старше 30 дней.

1. Зарегистрировать CRON задачу

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

2. Создать функцию удаления заказов

add_action('wc_auto_delete_old_orders', function() {
    $days = 30; // период в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type' => 'shop_order',
        'post_status' => ['wc-cancelled', 'wc-failed'],
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ],
        ],
        'fields' => 'ids',
        'posts_per_page' => -1,
        'no_found_rows' => true,
    ];

    $query = new WP_Query($args);
    if ($query->have_posts()) {
        foreach ($query->posts as $order_id) {
            wp_delete_post($order_id, true); // удалить без перемещения в корзину
        }
    }
});

3. Очистка расписания при деактивации темы или плагина

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

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

Для проверки работоспособности:

  • Перейдите в админку WordPress → WooCommerce → Заказы и отфильтруйте заказы со статусом отменённые или отклонённые старше 30 дней.
  • Запустите CRON вручную, чтобы проверить удаление (можно использовать плагин WP Crontrol для запуска события вручную).
  • Проверьте, что выбранные заказы удалились без ошибок.
  • Посмотрите ошибки в логах сервера на предмет сбоев.

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

  • Заказы не удаляются: Проверьте, что задача CRON добавлена и запускается. Для этого используйте WP Crontrol.
  • Удаляются не те заказы: Проверьте параметры post_status, чтобы они точно соответствовали статусам WooCommerce (например, wc-cancelled, wc-failed).
  • Удаление происходит, но заказы остаются в базе: Возможно, работает кеширование или транзакции базы данных. Убедитесь, что wp_delete_post вызывается с параметром true для окончательного удаления.
  • CRON не запускается на локальном сервере: Локальные окружения часто не запускают WP-Cron по расписанию. Запустите его вручную или настройте системный cron.

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

  • Удаление заказов — необратимая операция. Рекомендуется создавать резервные копии базы перед запуском автоматического удаления.
  • Используйте posts_per_page = -1 с осторожностью. Если заказов слишком много, лучше реализовать удаление партиями через пагинацию.
  • Для крупных магазинов с тысячами заказов можно оптимизировать запрос, добавляя ограничение по ID и запускать удаление несколько раз в сутки.
  • Обязательно очищайте расписания CRON при деактивации кода, чтобы избежать накопления ненужных задач.

Альтернативные подходы: плагин vs код vs компромисс

МетодПлюсыМинусыРекомендации
Плагин (например, WP Bulk Delete)Простота настройки, готовый интерфейс, дополнительные фильтрыДополнительная нагрузка, лишний код, возможные конфликтыДля неразработчиков или быстрых решений
Код в functions.php или плагинеЛегковесно, контроль, кастомизация под задачиТребует навыков, ответственность за безопасностьОптимально для разработчиков с опытом
Компромисс: код + сторонние инструментыГибкость, минимальный вес, контрольТребует настройки и тестированияДля магазинов с нестандартными требованиями
Как найти и удалить дубли archive-страниц и пагинации в WordPress
21.08.2026
Как создать уникальный виджет для вывода последних постов в WordPress с фильтрацией по категориям
29.01.2026
WooCommerce: автоматическое создание купонов при регистрации пользователя
23.06.2026
Как использовать REST API в WordPress для создания собственных функций
13.11.2025
Создать и использовать динамические корзинные элементы в WooCommerce с AJAX
17.02.2026