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

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

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

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

Если у вас наблюдаются следующие признаки, пора внедрять автоматическое удаление:

  • Медленная работа страницы со списком заказов в админке;
  • Увеличение размера базы данных из-за большого количества заказов со статусом refunded и cancelled;
  • Отчёты и аналитика затруднены из-за большого объёма неактуальных заказов;
  • Резервное копирование базы занимает слишком много времени.

Пошаговое решение: настройка автоматического удаления через cron и код

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

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

function wc_delete_old_refunded_cancelled_orders() {
    global $wpdb;
    $statuses = array('refunded', 'cancelled');
    $days = 30; // Удалять заказы старше 30 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    foreach ( $statuses as $status ) {
        // Получаем ID заказов по статусу и дате
        $orders = $wpdb->get_col($wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
            'wc-' . $status,
            $date_threshold
        ));

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

2. Регистрация cron задачи для регулярного удаления

Добавьте следующий код для запуска функции ежедневно:

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

add_action( 'wc_delete_old_orders_daily_event', 'wc_delete_old_refunded_cancelled_orders' );

3. Очистка cron задачи при деактивации

Чтобы избежать утечек cron задач, добавьте код удаления расписания при деактивации плагина:

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

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

  • Перейдите в админку WooCommerce - Заказы и проверьте наличие заказов со статусами refunded и cancelled, созданных более 30 дней назад - их должно не быть;
  • Для ручной проверки можете вызвать функцию wc_delete_old_refunded_cancelled_orders() напрямую в консоли WP-CLI: wp eval 'wc_delete_old_refunded_cancelled_orders();';
  • Проверьте логи сервера и ошибок WordPress на предмет сбоев при запуске cron;
  • Убедитесь, что размер базы данных уменьшился, а страницы заказов работают быстрее.

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

  • Заказы не удаляются: Проверьте, что статус заказа записан правильно — WooCommerce использует wc- префикс в статусах (например, wc-refunded), а не просто refunded.
  • Функция удаляет все заказы: Проверьте условие в SQL-запросе, убедитесь, что дата и статус фильтруются корректно.
  • Cron не запускается: Убедитесь, что на вашем сервере работает WP-Cron. При необходимости настройте системный cron для вызова wp-cron.php.
  • Удаление приводит к ошибкам или зависаниям: Для больших магазинов удаляйте заказы партиями по 50-100 штук, чтобы избежать таймаутов.

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

  • Используйте wp_delete_post($order_id, true) с параметром true, чтобы принудительно удалить пост без помещения в корзину, снижая нагрузку.
  • Регулярно делайте резервные копии базы данных перед внедрением автоматического удаления.
  • Если база слишком большая, рассмотрите пакетное удаление с использованием пагинации и WP_Query с ограничением.
  • Для критичных магазинов можно добавить логирование удалённых заказов в отдельный файл, чтобы отслеживать процесс.
  • Не удаляйте заказы, если используете сторонние отчёты или интеграции, которые могут запрашивать эти данные.

Сравнение вариантов реализации автоматического удаления заказов

МетодПреимуществаНедостаткиРекомендации
Код с cron Гибкость, контроль, бесплатно Нужны навыки программирования, возможны ошибки Рекомендуется для опытных разработчиков
Плагин (например, WP Bulk Delete) Простота настройки, интерфейс Может нагрузить сервер, не всегда гибко Подходит для небольших сайтов
Ручное удаление Полный контроль Трудозатратно, не автоматично Использовать для разовых чисток
Как исправить ошибку 500 в WooCommerce после обновления
18.04.2026
WooCommerce: как исправить проблемы с автоматическим удалением неоплаченных заказов
10.06.2026
WooCommerce: автоматическое удаление отказанных и возвращённых заказов
19.06.2026
WooCommerce: как настроить автоматическое удаление неоплаченных заказов
23.05.2026
Как создать nestable список в WordPress с помощью плагинов и кода
01.11.2025