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

Диагностика проблемы с отменёнными заказами в WooCommerce

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

Чтобы проверить наличие отменённых заказов, зайдите в админку WooCommerce: Заказы > Все заказы и отфильтруйте по статусу Отменён. Если таких заказов много — пора автоматизировать их удаление.

Почему важно автоматизировать удаление отменённых заказов и товаров из них?

  • Уменьшается размер базы данных, что ускоряет запросы и админку.
  • Повышается точность отчётов и аналитики по заказам.
  • Сокращается риск ошибок при обработке заказов и инвентаризации.
  • Автоматизация экономит время и исключает рутину.

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

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

Добавьте следующий код в functions.php вашей дочерней темы или в специальный плагин для кастомного кода:

function wpcource_delete_cancelled_orders() {
    // Получаем отменённые заказы старше 7 дней
    $args = array(
        'status' => 'cancelled',
        'date_created' => '<' . ( time() - 7 * DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );
    $cancelled_orders = wc_get_orders($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);
    }
}

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

Чтобы функция запускалась регулярно, например, раз в сутки, добавьте следующий код:

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

add_action('wpcource_daily_delete_cancelled_orders', 'wpcource_delete_cancelled_orders');

3. Очистка WP-Cron и мониторинг

Для проверки расписания используйте плагин WP Crontrol или вызовите вручную функцию через консоль WP-CLI:

wp eval 'wpcource_delete_cancelled_orders();'

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

  • Через 7+ дней отменённые заказы будут удалены из админки WooCommerce.
  • Связанные товары в этих заказах также будут удалены, проверяйте это через просмотр заказов.
  • Проверьте таблицу wp_posts на наличие заказов со статусом cancelled через SQL-запрос:
SELECT ID, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';

Если запрос ничего не возвращает, значит заказы успешно удаляются.

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

  • Заказы не удаляются: проверьте, что функция запускается через WP-Cron. Используйте error_log внутри функции для отладки.
  • Удаляются не те заказы: убедитесь, что в параметрах wc_get_orders указан правильный статус cancelled и дата создания.
  • Связанные товары не удаляются из заказов: убедитесь, что используется метод remove_item() и вызывается save() для сохранения изменений.
  • Высокая нагрузка при удалении большого количества заказов: добавьте ограничение количества заказов в одном запуске, например, 'limit' => 20, и используйте повторные запуски.

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

  • Резервное копирование: всегда делайте бэкап базы данных перед внедрением автоматического удаления данных.
  • Проверка прав доступа: убедитесь, что функция запускается от имени пользователя с нужными правами, если вызываете вручную.
  • Оптимизация запросов: используйте фильтры и ограничивайте выборку заказов по дате и количеству, чтобы не создавать пиков нагрузки.
  • Логирование: добавьте логирование удалённых заказов для аудита и возможности восстановления, например, через error_log('Deleted order ID: ' . $order_id);.

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

МетодПлагинКодКомпромисс
Удаление заказовПлагины очистки БД (например, WP-Optimize)Самописный код на WP-CronПлагины удобны, но могут удалять лишнее; код — точечный и контролируемый
Удаление товаров из заказовОтдельных плагинов нетИспользование remove_item() и save()Только код позволяет аккуратно удалить товары без побочных эффектов
ЗапускИнтерфейс плагиновWP-Cron + WP-CLIКод требует настройки расписания и мониторинга
Оптимальные хуки WordPress для улучшения производительности сайта
29.11.2025
Как использовать хуки для динамического отображения контента в WordPress
20.02.2026
Как удалить записи определённого автора в WordPress с помощью кода
01.04.2026
Как удалить разные виды кеша в WordPress
15.02.2026
Как создать автоматический Sitemap в WordPress без плагинов
25.12.2025

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