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

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

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

В стандартном интерфейсе WooCommerce нет удобного инструмента для массового удаления заказов по дате и статусу, поэтому оптимальным решением станет кастомный PHP-код, который при необходимости можно запустить в админке или через WP-CLI.

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

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

Используем WP_Query с типом записи shop_order, фильтруя по статусу и дате создания заказа:

function get_orders_by_status_and_date( $status, $date_before ) {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-' . $status,
        'posts_per_page' => -1,
        'date_query'     => [
            [
                'before'    => $date_before,
                'inclusive' => true,
            ],
        ],
        'fields'         => 'ids', // Получим только ID заказов
    ];
    $query = new WP_Query( $args );
    return $query->posts;
}

2. Функция удаления заказов по ID

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

function delete_orders_by_ids( $order_ids ) {
    foreach ( $order_ids as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

3. Объединяем и запускаем удаление

Пример вызова для удаления отменённых заказов старше 6 месяцев:

$status = 'cancelled';
$date_before = date( 'Y-m-d', strtotime( '-6 months' ) );
$order_ids = get_orders_by_status_and_date( $status, $date_before );
if ( ! empty( $order_ids ) ) {
    delete_orders_by_ids( $order_ids );
    echo 'Удалено заказов: ' . count( $order_ids );
} else {
    echo 'Заказы для удаления не найдены.';
}

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

  • В админке WooCommerce перейдите в раздел заказов, отфильтруйте по нужному статусу и дате — заказы должны отсутствовать.
  • Для проверки через базу данных выполните запрос в phpMyAdmin:
    SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 6 MONTH); — запрос должен вернуть пустой результат.
  • Если используете WP-CLI, вызовите wp post list --post_type=shop_order --post_status=wc-cancelled --date_query='before=6 months ago' до и после удаления.

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

  • Ошибка: Не удаляются заказы, хотя ID возвращаются.
    Причина: Недостаточно прав пользователя, под которым запускается код.
    Решение: Запускайте код под администратором, либо через WP-CLI от имени администратора.
  • Ошибка: Функция wp_delete_post не удаляет связанные мета-данные.
    Решение: По умолчанию wp_delete_post удаляет мета-данные, но если есть сторонние таблицы, очистите их отдельно.
  • Ошибка: Скрипт тормозит на большом количестве заказов.
    Решение: Разбейте удаление на порции с использованием параметра posts_per_page и циклом с пагинацией.

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

  • Запускайте большие операции удаления только на тестовом сервере или в нерабочее время.
  • Резервное копирование базы данных перед массовым удалением — обязательное условие.
  • Для регулярной очистки оформите задачу через WP-Cron с ограничением количества заказов на удаление за один запуск.
  • Используйте транзакции базы данных при необходимости для предотвращения повреждений данных.

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

Способ Плюсы Минусы Когда использовать
Ручное удаление через админку Простота, не требует кода Нет фильтрации по дате, долго при большом объёме Малое количество заказов, единичные удаления
Плагин для массового удаления Удобный интерфейс, можно фильтровать Может влиять на производительность, риск несовместимости Средний объём, без программного опыта
Кастомный код (описанный в статье) Точная фильтрация, автоматизация, масштабируемость Требует навыков разработки, риск ошибок без тестирования Большие объёмы, регулярные операции, интеграции
Как создать адаптивные блоки в WordPress Gutenberg
02.12.2025
Как создать динамические таблицы в WordPress с помощью шорткодов
06.01.2026
Как создать автоматические уведомления в WordPress по событиям с помощью WPRemark
04.03.2026
Как создать собственный виджет WordPress с использованием классов
13.11.2025
Как удалить все продажи WooCommerce по дате и статусу
29.04.2026