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

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

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

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

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

1. Создание планового задания для проверки статусов заказов

Для регулярного удаления отменённых заказов используем WP-Cron. Добавим функцию, которая будет запускаться, например, раз в сутки.

add_action('wpcource_delete_cancelled_orders_daily', 'wpcource_delete_cancelled_orders_function');

if (!wp_next_scheduled('wpcource_delete_cancelled_orders_daily')) {
    wp_schedule_event(time(), 'daily', 'wpcource_delete_cancelled_orders_daily');
}

2. Функция удаления заказов и связанных товаров

В этой функции мы получаем все заказы со статусом cancelled, затем удаляем их через стандартную функцию WooCommerce wp_delete_post с параметром true для безвозвратного удаления.

function wpcource_delete_cancelled_orders_function() {
    $args = [
        'post_type' => 'shop_order',
        'post_status' => 'wc-cancelled',
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];

    $cancelled_orders = get_posts($args);

    foreach ($cancelled_orders as $order_id) {
        // Загружаем объект заказа
        $order = wc_get_order($order_id);

        if (!$order) continue;

        // Удаляем товары из заказа (если нужно очистить дополнительные данные)
        foreach ($order->get_items() as $item_id => $item) {
            $order->remove_item($item_id);
        }

        $order->save();

        // Безвозвратное удаление заказа
        wp_delete_post($order_id, true);
    }
}

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

Чтобы не оставлять мусор в планировщике, удалим событие при деактивации.

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

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

После активации кода и запуска cron (можно вручную через WP CLI: wp cron event run wpcource_delete_cancelled_orders_daily) проверьте:

  • В админке WooCommerce отсутствуют заказы со статусом "Отменён";
  • В базе данных в таблице wp_posts нет записей с типом shop_order и статусом wc-cancelled;
  • Отчёты и аналитика не учитывают отменённые заказы;
  • Размер базы данных и резервных копий уменьшился при регулярной очистке.

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

  • Код не запускается автоматически: проверьте, включён ли WP-Cron и нет ли конфликтов с плагинами, блокирующими события cron.
  • Заказы не удаляются: убедитесь, что статус заказа точно wc-cancelled, а не просто "cancelled" без префикса wc-. Используйте get_post_status($order_id) для проверки.
  • Удаляются не те заказы: проверьте аргументы в get_posts — статус и тип должны быть корректными.
  • Удаление товаров из заказа не работает: убедитесь, что вы вызываете $order->save() после удаления позиций.

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

  • Не запускайте очистку чаще, чем раз в сутки, чтобы не создавать нагрузку на базу данных.
  • Перед массовым удалением сделайте резервную копию базы данных.
  • Используйте WP-CLI для ручного запуска и отладки вместо постоянного cron, если сайт нагружен.
  • Если база очень большая, стоит обрабатывать заказы пакетами по 50-100 штук за раз.
  • Регулярно оптимизируйте таблицы базы данных после удаления большого количества записей.

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

МетодПлюсыМинусыРекомендации
Ручное удаление через админкуПросто, без кодаТрудоёмко, риск пропуска заказовПодходит для небольших магазинов
Плагин очистки заказовАвтоматизация, настройкиДополнительная нагрузка, возможны конфликтыИспользовать проверенные плагины
Собственный код с WP-CronГибкость, контроль, нет лишних плагиновТребует навыков разработки, тестированияОптимально для опытных разработчиков
Как установить ограничение на регистрацию пользователей WordPress по IP и времени
13.04.2026
Как удалить автоматические редиректы в WordPress
29.01.2026
WordPress: как удалить ненужные мета данные из head без плагинов
15.12.2025
Удаление неиспользуемых CSS и JS в WordPress для ускорения загрузки
26.01.2026
WordPress: автоматический экспорт данных в Excel
18.11.2025

Обучение разработке на WordPress, как создавать темы, плагины. Подробнее об обучении.