WooCommerce: автоматическое удаление заказов по неактивности и статусу

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

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

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

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

Часто критерии следующие:

  • Статусы: pending, failed, cancelled, refunded
  • Время с момента создания: больше 30 или 60 дней
  • Отсутствие оплаты и движения по заказу

Перед автоматическим удалением важно убедиться, что заказы действительно неактивны и не нужны для отчетности.

Пошаговое решение: код для удаления неактивных заказов по расписанию

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

<?php
// 1. Создаём cron задачу при активации темы/плагина
function wpdir_schedule_delete_old_orders() {
    if ( ! wp_next_scheduled( 'wpdir_delete_old_orders_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'wpdir_delete_old_orders_hook' );
    }
}
add_action( 'wp', 'wpdir_schedule_delete_old_orders' );

// 2. Функция удаления
function wpdir_delete_old_orders() {
    $statuses = array( 'pending', 'failed', 'cancelled' );
    $days_old = 30; // удалять заказы старше 30 дней

    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days")),
    );

    $args = array(
        'status' => $statuses,
        'limit' => -1,
        'date_created' => $date_query,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_trash_post( $order_id ); // можно заменить на wp_delete_post для окончательного удаления
    }
}

// 3. Привязываем функцию к крону
add_action( 'wpdir_delete_old_orders_hook', 'wpdir_delete_old_orders' );

// 4. Очищаем cron при деактивации темы/плагина
function wpdir_clear_schedule_delete_old_orders() {
    $timestamp = wp_next_scheduled( 'wpdir_delete_old_orders_hook' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpdir_delete_old_orders_hook' );
    }
}
register_deactivation_hook( __FILE__, 'wpdir_clear_schedule_delete_old_orders' );
?>

Код создаёт ежедневное событие, которое удаляет заказы с указанными статусами старше 30 дней. Удаление происходит через перемещение в корзину — если хотите удалить окончательно, используйте wp_delete_post.

Как проверить, что удаление работает

  • В админке WooCommerce перейдите в раздел заказов и отфильтруйте по статусам pending, failed, cancelled. Запишите количество заказов старше 30 дней.
  • Запустите вручную функцию удаления через WP-CLI: wp eval 'wpdir_delete_old_orders();' или временно добавьте вызов функции в functions.php.
  • Проверьте, что старая часть заказов переместилась в корзину или удалена.
  • Для отладки можно добавить логирование в функцию удаления:
function wpdir_delete_old_orders() {
    $statuses = array( 'pending', 'failed', 'cancelled' );
    $days_old = 30;

    $date_query = array(
        'column' => 'post_date',
        'before' => date('Y-m-d H:i:s', strtotime("-{$days_old} days")),
    );

    $args = array(
        'status' => $statuses,
        'limit' => -1,
        'date_created' => $date_query,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        error_log("Удаление заказа #" . $order_id);
        wp_trash_post( $order_id );
    }
}

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

  • Функция не вызывается по расписанию: Проверьте, что WP-Cron работает (например, активен ли трафик на сайте). Для стабильной работы лучше настроить системный cron, вызывающий wp-cron.php.
    Команда для системного cron: wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
  • Заказы не удаляются: проверьте права пользователя, под которым запускается WP. Также убедитесь, что в статусах заказа вы указали правильные ключи (например, cancelled, а не cancel).
  • Удаление удаляет нужные заказы: перед удалением добавьте логи и проверьте выборку. Лучше сначала перемещать в корзину, а не удалять сразу.

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

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

Сравнение способов удаления заказов

МетодПлюсыМинусыКомпромисс
Удаление через wp_trash_postМожно восстановить, безопасноЗаказы остаются в корзине и могут занимать местоОчищать корзину вручную или по крону
Удаление через wp_delete_postПолное удаление, освобождает местоНевозможно восстановить, риск потери данныхИспользовать с осторожностью, после тестов
Плагины для очистки базыУдобство, готовые решенияМогут быть избыточными или не подходить под критерииКомбинировать с кастомным кодом
Как использовать WP-Cron для автоматизации задач в WordPress
09.06.2026
Как создать и использовать хлебные крошки в WordPress
11.02.2026
Как настроить выработку изображений в WordPress для улучшения производительности
10.01.2026
WooCommerce: автоматическое удаление заказов по статусу и дате
10.05.2026
Как удалить неиспользуемые метаданные в WordPress для оптимизации сайта
10.12.2025