WooCommerce: автоматическое удаление отменённых заказов по расписанию с оптимизацией

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

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

Пошаговое решение: как настроить автоматическое удаление отменённых заказов

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

В WooCommerce статус отменённого заказа может быть кастомным, но чаще используется cancelled. Настроим функцию, которая будет удалять все заказы со статусом cancelled, которым больше определённого времени (например, 7 дней).

function wpdirect_delete_cancelled_orders() {
    $days_old = 7; // количество дней, по истечении которых заказы удаляются
    $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-cancelled',
        'date_query' => array($date_query),
        'posts_per_page' => -1,
        'fields' => 'ids',
        'no_found_rows' => true,
    );

    $orders = get_posts($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // принудительное удаление
        }
    }
}

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

Добавим событие, которое будет запускать функцию ежедневно.

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

add_action('wpdirect_daily_cancelled_orders_cleanup', 'wpdirect_delete_cancelled_orders');

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

  • Проверьте наличие отменённых заказов старше 7 дней в разделе «Заказы» WooCommerce до и после запуска Cron.
  • Запустите функцию вручную через админку или WP CLI: wp eval 'wpdirect_delete_cancelled_orders();' и убедитесь, что заказы удаляются.
  • Проверьте логи сервера на наличие ошибок при выполнении задачи.

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

  • Функция не вызывается автоматически: убедитесь, что Cron работает корректно на хостинге. Запустите wp cron event list через WP CLI и проверьте наличие задачи wpdirect_daily_cancelled_orders_cleanup.
  • Заказы не удаляются: проверьте, что статус заказа именно wc-cancelled, а не кастомный. Можно получить список статусов через wc_get_order_statuses().
  • Удаление не полное (оставляются мета-данные): используйте wp_delete_post($order_id, true) с флагом принудительного удаления.
  • Высокая нагрузка при большом количестве заказов: добавьте пагинацию в запросы и удаляйте партии заказов по 50–100 штук за один запуск.

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

  • Добавьте проверку прав пользователя или используйте wp_verify_nonce, если будете запускать очистку вручную из админки.
  • Для больших магазинов реализуйте удаление пакетами с использованием параметра posts_per_page и повторным планированием задачи до полного удаления.
  • Используйте транзиенты или пользовательские опции для хранения временного состояния удаления, чтобы избежать повторного удаления одних и тех же заказов.
  • Ведите логи удаления в отдельный файл или таблицу для аудита и отладки.

Сравнение вариантов удаления отменённых заказов

МетодПлюсыМинусыРекомендации
Ручное удаление через админкуПросто, без кодаТрудозатратно, высок риск пропуска заказовПодходит для маленьких магазинов
Плагин очистки заказовАвтоматизация, удобный интерфейсДополнительная нагрузка, зависимость от стороннего кодаИспользовать проверенные плагины
Код на Cron (как в статье)Гибкость, контроль, отсутствие сторонних зависимостейТребует навыков разработки, настройка cronОптимально для разработчиков и масштабных проектов
WooCommerce: авторизация и регистрация без перезагрузки страницы (AJAX)
05.08.2026
Как отключить отображение товаров без остатка в WooCommerce и не сломать каталог
09.08.2026
Как найти и убрать дубли meta title и description в WordPress
19.08.2026
Как создать умное обновление данных в WordPress с помощью Webhook’ов
18.02.2026
Как создать автоматическое удаление старых постов в WordPress
28.03.2026