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

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

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

Как работает удаление заказов в WooCommerce

Заказы в WooCommerce — это кастомный тип записи post_type = shop_order. Статус заказа хранится в post_status и обычно имеет значения wc-pending, wc-processing, wc-cancelled и т.д.

Удаление заказа — это удаление поста и связанных с ним мета-данных и записей в таблицах WooCommerce.

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

1. Добавляем функцию для удаления заказов старше 7 дней

function wptricks_delete_old_cancelled_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '7 days ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $old_orders = get_posts($args);

    if (!empty($old_orders)) {
        foreach ($old_orders as $order_id) {
            wp_delete_post($order_id, true); // true — принудительное удаление без корзины
        }
    }
}

2. Запускаем функцию по расписанию через WP-Cron

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

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

add_action('wptricks_daily_order_cleanup_hook', 'wptricks_delete_old_cancelled_orders');

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

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

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

  • В админке WooCommerce зайдите в список заказов и отфильтруйте по статусу «Отменён». Заказы старше 7 дней должны постепенно исчезать.
  • Для теста создайте тестовый заказ, отмените его, измените дату создания в базе на дату более 7 дней назад и запустите крон задачу вручную:
do_action('wptricks_daily_order_cleanup_hook');
  • Проверьте, что заказ удалился из базы (таблица wp_posts и связанные с ним данные из wp_postmeta и WooCommerce таблиц).

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

  • Заказы не удаляются: Проверьте, что cron событие действительно запускается. Для диагностики используйте плагин WP Crontrol.
  • Удаляются не те заказы: Убедитесь, что фильтр post_status указан правильно как wc-cancelled. Другие статусы не будут затронуты.
  • Удаление занимает слишком много времени: если заказов очень много, разбейте удаление на порции (например, по 50 заказов за раз), чтобы избежать таймаутов.
  • Отсутствует резервное копирование: перед внедрением обязательно делайте резервную копию базы, особенно если удаляете данные программно.

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

  • Используйте wp_delete_post с параметром true для полного удаления и очистки связанных метаданных.
  • Для больших баз данных реализуйте пакетную обработку удаления с помощью offset и posts_per_page в запросе.
  • Проверяйте доступ к функциям удаления — запускайте код только с правами администратора или в рамках cron-задачи, чтобы избежать случайного удаления через браузер.
  • Регулярно оптимизируйте таблицы базы данных после массового удаления заказов.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаТрудозатратно при большом количестве, риск пропуска
Плагины очистки WooCommerceУдобно, автоматизация, настройкиЗависимость от сторонних разработчиков, лишние функции
Собственный код с WP-Cron (описан выше)Гибкость, полное управление, отсутствие лишних функцийТребует знаний PHP, настройка cron
Как использовать AJAX в WordPress для обновления контента без перезагрузки
23.12.2025
WooCommerce: авторизация пользователей через SMS без плагинов
23.04.2026
WooCommerce: автоматическое создание заказов и управление статусами через код
20.05.2026
Как автоматически удалять старые изображения в WordPress
13.04.2026
Как удалить старые версии плагинов в WordPress и освободить место
07.02.2026