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

|

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

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

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

Для начала нужно понять, какие статусы критичны для очистки. Чаще всего это статусы:

Удалять заказы нужно аккуратно, чтобы не потерять важную статистику и историю.

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

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

function wpreboot_delete_orders_by_status( $status = 'cancelled' ) {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-' . $status),
        'posts_per_page' => 100,
        'fields'         => 'ids',
    );

    $orders = get_posts( $args );

    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true ); // true - без отправки в корзину
    }
}

2. Добавляем планировщик задач (WP-Cron) для регулярного запуска

function wpreboot_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wpreboot_order_cleanup_hook' ) ) {
        wp_schedule_event( time(), 'daily', 'wpreboot_order_cleanup_hook' );
    }
}
add_action( 'wp', 'wpreboot_schedule_order_cleanup' );

add_action( 'wpreboot_order_cleanup_hook', function() {
    // Удаляем отменённые и неудачные заказы ежедневно
    wpreboot_delete_orders_by_status( 'cancelled' );
    wpreboot_delete_orders_by_status( 'failed' );
} );

3. Очистка по другим статусам и кастомизация

Вы можете расширить функцию, передавая массив статусов или добавляя проверку даты создания заказа, чтобы удалять только старые записи, например старше 30 дней. Для этого добавьте параметр date_query в get_posts:

$args['date_query'] = array(
    array(
        'column' => 'post_date',
        'before' => '30 days ago',
    ),
);

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

Чтобы убедиться, что задача работает:

Частые ошибки и способы исправления

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

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

МетодПлюсыМинусыПрименимость
Ручное удаление через админку WooCommerce Простота, не требует кода Трудоёмко при большом количестве заказов Малые магазины
Кастомный код с WP-Cron Автоматизация, гибкость, учёт бизнес-логики Требует навыков разработки, можно ошибиться Средние и крупные магазины
Плагины (напр. Clearfy Pro) Простота настройки, дополнительные функции оптимизации Ограниченная кастомизация, возможны конфликты Любой уровень с бюджетом на плагины
Как запретить регистрацию на WordPress: функции и плагины для контроля доступа
26.01.2026
WooCommerce: как автоматически удалять заказы по определённому статусу
31.05.2026
Как удалить или изменить slug постов WordPress без потери ссылок
07.01.2026
WooCommerce: как автоматически удалять отзывы о товарах через заданный период
30.04.2026
Как удалить пустые термины в WordPress через код и плагины
05.04.2026
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙