Автоматическое удаление отменённых и отложенных заказов в WooCommerce

Почему важно удалять отменённые и отложенные заказы в WooCommerce

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

Автоматизация очистки заказов по статусу и возрасту — простой способ держать базу данных в порядке без ручного вмешательства.

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

  • Админка WooCommerce начинает грузиться медленнее, особенно раздел «Заказы»
  • Количество заказов с статусом cancelled и on-hold растёт и не уменьшается
  • База данных занимает больше места, чем ожидалось (проверяется через phpMyAdmin или панели хостинга)
  • Появляются задержки при генерации отчётов по продажам

Для быстрой проверки через консоль WordPress можно выполнить запрос к базе на количество заказов по статусам:

global $wpdb;
$cancelled_count = $wpdb->get_var("SELECT COUNT(ID) FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled'");
echo "Отменённых заказов: $cancelled_count";

Пошаговое решение: автоматическое удаление заказов с помощью WP-Cron

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

function wpstudy_delete_old_orders() {
    if ( ! class_exists( 'WooCommerce' ) ) {
        return; // WooCommerce не активен
    }

    global $wpdb;

    // Статусы для удаления
    $statuses = ['wc-cancelled', 'wc-on-hold'];
    
    // Сколько дней хранить заказы перед удалением
    $days_to_keep = 30;
    $date_limit = date('Y-m-d H:i:s', strtotime("-{$days_to_keep} days"));

    foreach ($statuses as $status) {
        // Получаем ID заказов для удаления
        $orders = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            $status, $date_limit
        ));

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

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

add_action('wpstudy_delete_old_orders_hook', 'wpstudy_delete_old_orders');

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

3. Очистка WP-Cron при деактивации (опционально)

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

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

  • Через 1-2 дня проверьте, что количество заказов в статусах cancelled и on-hold уменьшилось (через админку или SQL-запрос).
  • Включите журнал ошибок и проверьте логи на наличие ошибок при выполнении WP-Cron задач.
  • Можно вручную запустить функцию, вызвав хук через WP-CLI: wp cron event run wpstudy_delete_old_orders_hook
  • Проверьте, что удалённые заказы действительно не отображаются в админке и не занимают место в базе.

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

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

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

  • Используйте wp_delete_post($order_id, true) для полного удаления, чтобы не оставлять метаданные и записи в таблицах.
  • Перед удалением сделайте резервную копию базы, особенно если удаление впервые.
  • Для больших магазинов рассмотрите выполнение удаления в несколько шагов с сохранением прогресса, чтобы избежать перегрузок сервера.
  • Можно добавить логирование удалённых заказов в отдельный файл для аудита.
  • Для расширенного контроля используйте параметры функции для выбора статуса и периода хранения через админ-панель или настройки плагина.

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

МетодПреимуществаНедостатки
Плагин для очистки WooCommerceПростота установки, готовый интерфейсМожет быть тяжеловесным, не всегда гибкий
Собственный WP-Cron скрипт (код)Полный контроль, легковесность, гибкостьТребует навыков, может не запускаться при низком трафике
Ручное удаление через админкуПростота, не требует кодаТрудоёмко, не подходит для больших объёмов
Как добавить временные изменения в шаблон WordPress без плагинов
03.02.2026
Как добавить настройку локализации в плагин WordPress
29.01.2026
WooCommerce: как добавить поле для ввода серийного номера товара в корзине
11.05.2026
Автоматическое удаление отменённых и отложенных заказов в WooCommerce
02.08.2026
WooCommerce: как добавить отложенную оплату для заказов
21.04.2026