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

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

В WooCommerce накапливаются заказы с разными статусами, включая отказанные (failed) и возвращённые (refunded). Если их не удалять, база данных растёт, что замедляет сайт и усложняет управление заказами. Автоматизация удаления этих заказов помогает поддерживать базу в порядке и облегчает администрирование.

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

Проверьте количество заказов с нужными статусами через SQL-запрос:

SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-failed', 'wc-refunded') GROUP BY post_status;

Если количество таких заказов превышает несколько сотен, это сигнал к автоматизации удаления.

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

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

function wc_delete_orders_by_status( $statuses = array(), $older_than_days = 7 ) {
    if ( empty( $statuses ) ) {
        return;
    }

    $date_query = date( 'Y-m-d H:i:s', strtotime( "-{$older_than_days} days" ) );
    
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array_map( function( $status ) { return 'wc-' . $status; }, $statuses ),
        'date_query'     => array(
            'before' => $date_query,
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
        'no_found_rows'  => true,
    );

    $query = new WP_Query( $args );

    if ( $query->have_posts() ) {
        foreach ( $query->posts as $order_id ) {
            wp_delete_post( $order_id, true );
        }
    }
}

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

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

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

add_action( 'wc_delete_failed_refunded_orders_daily', function() {
    wc_delete_orders_by_status( array( 'failed', 'refunded' ), 7 );
} );

3. Добавление кода в functions.php или в собственный плагин

Рекомендуется создать небольшой плагин для удобства контроля и отключения функции при необходимости.

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

  • Через несколько дней проверьте таблицу заказов на предмет наличия старых отказанных и возвращённых заказов.
  • Запустите вручную функцию для теста (например, через WP-CLI или временно вызовите функцию напрямую) и проверьте, удалились ли заказы.
  • Проверьте логи ошибок сервера и WordPress на предмет сбоев.

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

Ошибка 1: Заказы не удаляются

  • Проверьте правильность статусов: WooCommerce добавляет префикс wc- к статусам заказов.
  • Убедитесь, что WP-Cron работает корректно. Для этого можно использовать плагин WP Crontrol.
  • Проверьте права пользователя, под которым выполняется код, и права на удаление постов.

Ошибка 2: Удаляются не те заказы

  • Проверьте корректность параметра $older_than_days — возможно, срок слишком большой.
  • Проверьте, что в запросе фильтруются только нужные статусы.

Ошибка 3: Высокая нагрузка при удалении большого количества заказов

  • Добавьте лимит на количество удаляемых заказов за один запуск (например, posts_per_page => 50) и используйте повторный запуск до полного удаления.

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

  • Удаление заказов — операция необратимая, используйте параметр wp_delete_post( $order_id, true ) с осторожностью.
  • Для критичных магазинов лучше сначала архивировать данные в отдельную таблицу или экспортировать перед удалением.
  • Рекомендуется тестировать на копии сайта.
  • Используйте WP Crontrol для мониторинга и управления крон-задачами.
  • Если база слишком большая, разбивайте удаление на несколько этапов с лимитами.

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

МетодПлюсыМинусы
Плагин (например, Advanced WooCommerce Cleaner) Простота настройки, интерфейс, дополнительные опции Зависимость от стороннего кода, возможная нагрузка, лицензии
Своя реализация через WP-Cron и WP_Query Полный контроль, отсутствие лишних зависимостей, легковесность Требует навыков программирования, ответственность за код
Удаление вручную через SQL-запросы Максимальная скорость, точечное удаление Высокий риск ошибок, нет логов, сложно автоматизировать
Автоматическое удаление старых черновиков в WordPress
22.12.2025
Как использовать хуки в WordPress для автоматизации задач
07.12.2025
WordPress автоматическое удаление спама в комментариях: эффективные решения
30.11.2025
Автоматическое создание отчёта об ошибках в WordPress
12.12.2025
Правильное использование REST API в WordPress для автоматизации задач
25.02.2026