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

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

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

Удаление старых заказов по определённому статусу (например, «отменённые» или «выполненные») позволяет поддерживать базу данных в оптимальном состоянии. Но стандартного функционала для массового удаления заказов WooCommerce не предлагает, а популярные плагины часто либо избыточны, либо влияют на производительность.

Цель — создать надёжный, безопасный и автоматический механизм очистки заказов по статусу через собственную функцию с использованием WP-Cron.

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

1. Определяем критерии удаления

Выберите статус заказа и период давности, например, удалить все «отменённые» заказы старше 30 дней.

2. Добавляем функцию удаления в файл functions.php вашей темы или в кастомный плагин

function wptemp_delete_old_orders_by_status() {
    $status_to_delete = 'cancelled'; // Статус заказа
    $days_old = 30; // Возраст заказа в днях

    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days")),
        'inclusive' => true,
    );

    $args = array(
        'post_type' => 'shop_order',
        'post_status' => 'wc-' . $status_to_delete,
        'date_query' => array($date_query),
        'fields' => 'ids',
        'posts_per_page' => -1,
        'no_found_rows' => true,
        'update_post_meta_cache' => false,
        'update_post_term_cache' => false,
    );

    $orders_to_delete = get_posts($args);

    if (!empty($orders_to_delete)) {
        foreach ($orders_to_delete as $order_id) {
            wp_delete_post($order_id, true); // Без отправки в корзину
        }
    }
}

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

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

add_action('wptemp_order_cleanup_hook', 'wptemp_delete_old_orders_by_status');

4. Добавляем функцию деактивации cron при отключении темы или плагина

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

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

  • Запустите функцию вручную (через временный вызов wptemp_delete_old_orders_by_status() в админке или через WP-CLI wp eval 'wptemp_delete_old_orders_by_status();') и убедитесь, что старые заказы удалились.
  • Проверьте в базе данных таблицу wp_posts, что посты типа shop_order со статусом wc-cancelled старше 30 дней отсутствуют.
  • Подтвердите, что WP-Cron запускается (используйте плагин WP Crontrol или логи сервера).

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

  • Заказы не удаляются. Проверьте, правильно ли указан статус заказа (wc-cancelled — корректный формат для WP запросов). Убедитесь, что функция вызывается и нет ошибок PHP.
  • Функция удаляет слишком много заказов. Проверьте условие date_query и статус. Для отладки выводите список ID заказов перед удалением.
  • Проблемы с WP-Cron. На некоторых серверах WP-Cron не запускается автоматически. Подключите системный Cron или используйте плагин WP Crontrol для принудительного запуска.
  • Удаление заказов влияет на производительность. Если заказов слишком много, разбейте удаление на порции, например, по 50 заказов за запуск.

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

  • Всегда делайте резервные копии базы данных перед массовым удалением.
  • Не используйте wp_delete_post в цикле без ограничений — добавьте лимит по количеству удаляемых заказов за один запуск, например:
$args['posts_per_page'] = 50;
  • Делайте отложенный запуск задачи через WP-Cron с интервалом не чаще одного раза в день.
  • В логах фиксируйте количество удалённых заказов и время запуска — для мониторинга.
  • Для сайтов с высокой нагрузкой рассмотрите использование системного Cron вместо WP-Cron.

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

МетодПлюсыМинусыКогда использовать
Код через WP-CronПолный контроль, нет сторонних плагинов, можно кастомизироватьНужны базовые знания PHP, требует тестирования и поддержкиСредние и крупные проекты с уникальными требованиями
Плагины типа "WooCommerce Order Cleaner"Простота установки, готовый функционалМогут грузить базу, лишний функционал, возможны конфликтыМаленькие проекты без ресурсов на разработку
Ручное удаление через админкуПростота, ничего не нужно программироватьТрудозатратно, риск ошибок, не подходит для большого объёмаМалое количество заказов, одноразовая очистка
Как автоматизировать обновление контента в WordPress с помощью WP-Cron и AJAX
16.03.2026
Как использовать Temporary Auth Cookie в WordPress для беспроблемного входа
23.01.2026
Как удалить пустые и неактивные регистрации пользователей в WordPress
20.01.2026
Автоматическое удаление старых корзин (сессий) в WooCommerce без плагинов
20.06.2026
Как использовать WPRemark для автоматического отзыва на сайте WordPress
22.03.2026