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"Простота установки, готовый функционалМогут грузить базу, лишний функционал, возможны конфликтыМаленькие проекты без ресурсов на разработку
Ручное удаление через админкуПростота, ничего не нужно программироватьТрудозатратно, риск ошибок, не подходит для большого объёмаМалое количество заказов, одноразовая очистка
WooCommerce: автоматическое удаление старых открытых заказов без плагинов
10.07.2026
Диагностика и решение проблемы неработающего WooCommerce AJAX в кэшировании корзины
07.07.2026
Как создать и настроить автоматический бэкап WordPress
12.11.2025
Как использовать WP_Temp для работы с временными данными в WordPress
15.04.2026
Как запретить регистрацию ботов в WordPress без плагинов
19.03.2026