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

|

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

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

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

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

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

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

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

function wpreboot_delete_orders_by_status() {
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return;
    }

    $status = 'wc-cancelled'; // замените на нужный статус заказа
    $days_old = 30; // удалять заказы старше 30 дней

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

    $args = array(
        'status' => $status,
        'date_created' => '<' . $date_threshold,
        'limit' => -1,
    );

    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        $order->delete( true ); // true - принудительное удаление
    }
}

2. Автоматизация через WP-Cron

Чтобы функция работала автоматически, добавим задачу в планировщик WordPress:

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

add_action( 'wpreboot_delete_orders_daily', 'wpreboot_delete_orders_by_status' );

Этот код запустит удаление заказов с указанным статусом и старше 30 дней ежедневно.

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

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);

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

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

$limit = 50;
$page = 1;
do {
    $args = array(
        'status' => $status,
        'date_created' => '<' . $date_threshold,
        'limit' => $limit,
        'paged' => $page,
    );
    $orders = wc_get_orders( $args );

    foreach ( $orders as $order ) {
        $order->delete( true );
    }
    $page++;
} while ( count( $orders ) === $limit );

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

МетодПлюсыМинусыПрименение
Ручное удаление через админкуПросто, без кодаТрудоёмко при большом объёме заказовМаленькие магазины
WP-CLI командыБыстро и мощноТребует доступа к серверуАдминистраторы с доступом к SSH
Автоматизация через WP-Cron и PHPАвтоматически поддерживает базу в порядкеНужно контролировать работу WP-CronСредние и крупные магазины
Как автоматически удалять старые чужие сайты из базы данных WordPress
13.01.2026
WooCommerce: как автоматически удалять заказы по определённому статусу
31.05.2026
Создаем собственный виджет в WordPress на PHP: подробное руководство
05.11.2025
Как сделать автоматическое удаление простых категорий в WordPress по условию
05.03.2026
Как разделить длинный пост на страницы в WordPress: пошаговое руководство
05.04.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше