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

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

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

Задача: автоматизировать удаление заказов с определённым статусом (например, отменённые) старше заданного срока (например, 30 дней).

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

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

Сначала нужно написать PHP-функцию, которая будет искать заказы с нужным статусом и датой, а затем удалять их.

function wc_delete_old_orders_by_status( $status = 'cancelled', $days_old = 30 ) {
    // Получаем дату, старше которой нужно удалить заказы
    $date_query = date( 'Y-m-d H:i:s', strtotime( "-{$days_old} days" ) );

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-' . $status,
        'date_query'     => array(
            array(
                'column'    => 'post_date',
                'before'    => $date_query,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $query = new WP_Query( $args );

    if ( ! empty( $query->posts ) ) {
        foreach ( $query->posts as $order_id ) {
            wp_delete_post( $order_id, true ); // true - без возможности восстановления
        }
        return count( $query->posts );
    }
    return 0;
}

2. Запускаем функцию вручную или через WP-Cron

Вызов функции вручную (например, для тестирования):

add_action( 'admin_init', function() {
    if ( current_user_can( 'manage_woocommerce' ) && isset( $_GET['delete_old_cancelled_orders'] ) ) {
        $deleted = wc_delete_old_orders_by_status( 'cancelled', 30 );
        echo "Удалено заказов: " . $deleted;
        exit;
    }
});

Чтобы запустить удаление по расписанию, добавим WP-Cron задачу:

if ( ! wp_next_scheduled( 'wc_hourly_delete_old_cancelled_orders' ) ) {
    wp_schedule_event( time(), 'hourly', 'wc_hourly_delete_old_cancelled_orders' );
}

add_action( 'wc_hourly_delete_old_cancelled_orders', function() {
    wc_delete_old_orders_by_status( 'cancelled', 30 );
});

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

1. После ручного запуска по адресу https://ваш-сайт/admin/?delete_old_cancelled_orders=1 в админке отобразится количество удалённых заказов.

2. В базе данных (таблица wp_posts) должны отсутствовать заказы со статусом wc-cancelled, созданные более 30 дней назад.

3. Можно проверить в админке WooCommerce — список заказов должен обновиться, старые отменённые исчезнут.

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

  • Заказы не удаляются: проверьте правильность статуса заказа — в базе WooCommerce статусы имеют префикс wc-. Например, отменённые — wc-cancelled.
  • Функция не запускается по Cron: убедитесь, что WP-Cron работает нормально, или настройте системный cron для вызова wp-cron.php.
  • Удаление не происходит полностью: проверьте права пользователя, если запускаете вручную через админку, и что wp_delete_post вызывается с параметром true для полного удаления.
  • Перегрузка сервера при удалении большого количества заказов: разбивайте запрос на части, например, удалять по 100 заказов за раз с использованием параметра posts_per_page.

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

  • Резервное копирование: всегда делайте бэкап базы перед массовым удалением, чтобы избежать потери данных.
  • Постепенное удаление: если заказов много, запускайте удаление по частям через WP-Cron с ограничением количества заказов за один проход.
  • Ограничение доступа: ручной запуск должен быть доступен только администраторам с правами manage_woocommerce.
  • Логирование: добавьте логирование количества удалённых заказов в файл или системный журнал для мониторинга.

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

МетодПлюсыМинусы
Ручное удаление в админкеПросто, без кодаМного времени при большом количестве заказов, риск пропустить
Плагины для очистки заказовУдобный интерфейс, автоматизацияНагрузка на сайт, зависимость от стороннего кода
Код с WP-CronАвтоматизация, гибкость, полный контрольНеобходима техническая настройка, риск ошибок без тестирования
Как добавить временные изменения в шаблон WordPress без плагинов
03.02.2026
Оптимизация загрузки скриптов в WordPress: практические советы и примеры
06.04.2026
WooCommerce: как отправлять подробные данные о заказе в Slack при оформлении
27.05.2026
WP-Cron в WordPress: настройка и отладка автоматических задач
20.04.2026
WooCommerce: автоматическое удаление заказов по статусу и дате
24.04.2026