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
20.02.2026
Как автоматизировать удаление старого контента в WordPress
12.02.2026
Как удалить постоянные редиректы в WordPress: практическое руководство
26.03.2026
Как удалить пустые теги meta в WordPress без плагинов
17.01.2026
Как автоматизировать создание резервных копий WordPress с помощью кода
04.03.2026

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