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

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

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

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

Первым шагом проверьте, есть ли в вашем магазине заказы с устаревшими статусами, которые не должны храниться длительное время. Для этого выполните SQL-запрос в базе данных или используйте WP-CLI:

wp post list --post_type=shop_order --post_status=wc-cancelled --fields=ID,post_date --format=table

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

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

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

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

function wpmarketing_delete_orders_by_status( $status = 'wc-cancelled', $days_old = 30 ) {
    if ( ! class_exists( 'WC_Order_Query' ) ) {
        return;
    }

    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );

    $args = [
        'limit'        => -1,
        'status'       => $status,
        'date_created' => '<' . $date_threshold,
        'return'       => 'ids',
    ];

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

2. Автоматизируем удаление через Cron

Добавим планировщик задачи, которая будет запускать функцию автоматически раз в сутки.

// Регистрируем событие при активации темы или плагина
function wpmarketing_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wpmarketing_daily_order_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpmarketing_daily_order_cleanup' );
    }
}
add_action( 'wp', 'wpmarketing_schedule_order_cleanup' );

// Хук для удаления заказов
add_action( 'wpmarketing_daily_order_cleanup', function() {
    // Удаляем заказы со статусом 'cancelled', старше 30 дней
    wpmarketing_delete_orders_by_status( 'cancelled', 30 );
} );

// Очистка при деактивации
function wpmarketing_unschedule_order_cleanup() {
    $timestamp = wp_next_scheduled( 'wpmarketing_daily_order_cleanup' );
    if ( $timestamp ) {
        wp_unschedule_event( $timestamp, 'wpmarketing_daily_order_cleanup' );
    }
}
register_deactivation_hook( __FILE__, 'wpmarketing_unschedule_order_cleanup' );

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

  • Создайте тестовый заказ со статусом cancelled и датой создания старше 30 дней (можно через базу данных).
  • Запустите вручную функцию wpmarketing_delete_orders_by_status('cancelled', 30) через WP-CLI или временно добавьте вызов в functions.php.
  • Проверьте, что заказ удалён, например, через админку WooCommerce или SQL-запрос.
  • Проверьте журнал ошибок и логи сервера на предмет ошибок удаления.

Частые ошибки и способы их устранения

  • Заказы не удаляются: Проверьте, что у вас есть права на удаление постов, и функция вызывается корректно.
  • Неправильный статус заказа: WooCommerce использует статус с префиксом wc- в базе данных, но для wc_get_orders достаточно указать статус без префикса, например cancelled.
  • Удаляются не все нужные заказы: Проверьте параметр date_created и формат даты, а также правильно ли передаётся количество дней.
  • Ошибка с Cron: Убедитесь, что на вашем сервере настроен WP-Cron или системный cron для запуска планировщика.

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

  • Всегда делайте резервную копию базы данных перед автоматическими удалениями.
  • Для больших магазинов с тысячами заказов разбивайте удаление на партии, например, добавьте параметр 'limit' => 100 и запускайте функцию несколько раз.
  • Используйте wp_delete_post( $order_id, true ) с параметром true для полного удаления без перемещения в корзину.
  • Проверяйте логи и исключайте из удаления заказы с нестандартными статусами или важные для аналитики.

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

МетодПлюсыМинусыПример использования
Ручное удаление через админкуПростота, контроль по каждому заказуНеэффективно при большом объёмеWooCommerce → Заказы → Удалить
SQL-запрос в базеОчень быстро и массовоРиск потери данных, требует знаний SQLDELETE FROM wp_posts WHERE post_type='shop_order' AND post_status='wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);
Автоматизация через wp_schedule_eventПолная автоматизация, гибкостьТребует программирования, настройка cronКод из статьи выше
Удаление зависимых от плагинов данных после их удаления в WordPress
27.04.2026
Кастомизация полей оформления заказа WooCommerce без плагинов: подробное руководство
10.05.2026
Как создать автоматический маркетинговый отслеживатель клиентов в WordPress
13.04.2026
Как создать автоматическую оценку контента в WordPress
08.01.2026
Оптимизация заголовков в WordPress для SEO: практические советы и примеры
18.11.2025