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

|

Диагностика проблемы с неактивными и отменёнными заказами в WooCommerce

На интернет-магазинах на базе WooCommerce часто накапливаются заказы со статусами «отменён» (cancelled) и «ожидает оплаты» (pending), которые долго не меняются и засоряют базу данных. Это негативно влияет на производительность магазина и усложняет управление заказами. Чтобы убедиться в наличии таких заказов, выполните SQL-запрос в базе данных:

SELECT post_status, COUNT(*) as count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;

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

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

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

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

function wpreboot_delete_old_orders_by_status( $status = 'cancelled', $days = 30 ) {
    global $wpdb;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    // Получаем ID заказов
    $order_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
        'wc-' . $status,
        $date_threshold
    ) );

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

    foreach ( $order_ids as $order_id ) {
        wp_delete_post( $order_id, true ); // true - удаление без возможности восстановления
    }
}

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

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

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

// Хук для выполнения очистки
add_action( 'wpreboot_weekly_order_cleanup', function() {
    wpreboot_delete_old_orders_by_status( 'cancelled', 30 );
    wpreboot_delete_old_orders_by_status( 'pending', 14 );
} );

3. Вручную запускать очистку (для теста)

Чтобы проверить работоспособность функции без ожидания cron, вызовите её вручную, например, добавив временный код:

add_action( 'admin_init', function() {
    if ( current_user_can( 'manage_woocommerce' ) && isset( $_GET['run_order_cleanup'] ) ) {
        wpreboot_delete_old_orders_by_status( 'cancelled', 30 );
        wpreboot_delete_old_orders_by_status( 'pending', 14 );
        wp_die( 'Очистка заказов выполнена' );
    }
} );

После этого зайдите в админку с параметром ?run_order_cleanup=1 в URL (например, https://example.com/wp-admin/?run_order_cleanup=1).

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

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

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

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

ВариантПлюсыМинусы
Ручное удаление через админку WooCommerceПростота, без кодаТрудозатратно, не подходит для большого количества заказов
Плагины очистки заказовГотовое решение, настройки через UIМогут быть избыточными, нагрузка, возможны конфликты
Самописный код с WP-Cron (как в статье)Гибкость, точечное решение, контрольТребует навыков разработки, нужно следить за работой WP-Cron
WooCommerce: как автоматически удалять товары из корзины после оплаты с подробной инструкцией
20.06.2026
Как сделать автоматический откат изменений при ошибках в WordPress
22.02.2026
Как избежать ошибок 502 Bad Gateway в WordPress: практические решения
20.01.2026
Создаем настройки плагинов в WordPress с практическими примерами
02.12.2025
Как удалить пустые термины в WordPress через код и плагины
05.04.2026
×
WPShop
партнерка без «но»!

До 3225₽ за каждую продажу

Подключиться к игре