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

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

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

Как получить заказы WooCommerce по дате и статусу

Для выборки заказов воспользуемся классом WC_Order_Query, который позволяет фильтровать заказы по различным параметрам. Главное — правильно указать параметры даты и статуса.

$args = [
    'limit' => -1, // получить все подходящие заказы
    'status' => ['cancelled', 'refunded'], // статусы для удаления
    'date_created' => '<2023-01-01', // заказы до 1 января 2023
    'return' => 'ids' // получить только ID заказов
];

$query = new WC_Order_Query($args);
$order_ids = $query->get_orders();

Обратите внимание, что параметр date_created поддерживает операторы сравнения: <, >, =. Формат даты — ГГГГ-ММ-ДД.

Пошаговое удаление заказов через код

Для массового удаления создадим функцию, которую можно запустить из файла темы или плагина. Внимание: перед запуском обязательно сделайте резервную копию базы данных.

function wc_delete_orders_by_date_and_status($date_limit, $statuses = []) {
    if (empty($statuses)) {
        return 'Статусы не заданы';
    }

    $args = [
        'limit' => -1,
        'status' => $statuses,
        'date_created' => "<" . $date_limit,
        'return' => 'ids'
    ];

    $query = new WC_Order_Query($args);
    $order_ids = $query->get_orders();

    if (empty($order_ids)) {
        return 'Заказы не найдены';
    }

    foreach ($order_ids as $order_id) {
        wp_delete_post($order_id, true); // true — удаление без перемещения в корзину
    }

    return count($order_ids) . ' заказ(ов) удалено.';
}

// Пример вызова
// Удалить все отменённые и возвращённые заказы до 01.01.2023
$result = wc_delete_orders_by_date_and_status('2023-01-01', ['cancelled','refunded']);
echo $result;

Если нужно запускать очистку регулярно, можно привязать функцию к WP-Cron.

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

После выполнения удаление проверьте, что заказы действительно исчезли:

  • В админке WooCommerce в разделе «Заказы» примените фильтр по статусам и датам, по которым удаляли, и убедитесь, что заказов нет;
  • Проверьте базу данных в таблице wp_posts с типом shop_order — записи должны отсутствовать;
  • Убедитесь, что сайт работает без ошибок, нет ссылок на удалённые заказы.

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

  • Удаление не происходит или частично: Возможно, переданный статус не совпадает с реальным статусом заказов. Проверьте статусы через wc_get_order_statuses().
  • Заказы остаются в базе: Если wp_delete_post вызывается с параметром false, заказы попадают в корзину, а не удаляются окончательно.
  • Ошибка при запросе WC_Order_Query: Проверьте, что WooCommerce активен и загружен перед вызовом запроса.
  • Функция удаляет слишком много заказов: Уточните параметры фильтрации, особенно дату и статус. Добавьте логирование ID удаляемых заказов.

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

  • Перед массовым удалением всегда делайте бэкап базы данных.
  • Запускайте скрипт в периоды низкой нагрузки, чтобы избежать таймаутов.
  • Если заказов очень много, разбивайте удаление на партии (например, по 100 штук) с паузами через WP-Cron.
  • Для контроля доступа к функции используйте проверки прав, например current_user_can('manage_woocommerce').
  • Логируйте действия удаления в отдельный файл или таблицу для последующего аудита.

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

МетодПлюсыМинусы
Ручное удаление в админкеПросто, не требует кодаТолько по одному заказу, не масштабируемо
Использование плагина для массового удаленияУдобный интерфейс, фильтрыЗависимость от стороннего кода, могут быть лимиты
Программное удаление через WC_Order_Query и wp_delete_postГибкость, автоматизация, точные фильтрыТребует навыков, риск ошибок при неправильном коде
Автоматическое удаление старого контента WordPress по датам
25.02.2026
Как создать автоматический отчет о проблемах сайта WordPress
09.01.2026
Как создать автоматический редирект в WordPress по условиям
28.01.2026
Как создать автоматический бэкап WordPress: практическое руководство
28.11.2025
Как удалить пустые категории в WordPress через код
12.12.2025