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.03.2026
Как сделать автоматическое удаление простых категорий в WordPress по условию
05.03.2026
Как сделать автоматический редирект с удалением WWW в WordPress
13.03.2026
Безопасное управление WordPress через SSH с помощью PHP: практическое руководство
04.01.2026
Как автоматически удалять старые чужие сайты из базы данных WordPress
13.01.2026
×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙