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

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

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

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

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

Для выборки заказов используем класс WC_Order_Query. Пример выборки заказов в статусе cancelled и датой создания до 6 месяцев назад:

$args = [
    'status' => 'cancelled',
    'date_created' => '<' . date('Y-m-d', strtotime('-6 months')),
    'limit' => -1,
    'return' => 'ids',
];

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

Так мы получим массив ID заказов, подходящих под условия.

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

Удалять заказы нужно осторожно, чтобы не повредить данные сайта. Рекомендуется делать это пакетно по 50-100 заказов и с резервной копией базы.

Ниже пример функции для удаления заказов по статусу и дате:

function delete_woocommerce_orders_by_status_and_date($status, $date_before) {
    $args = [
        'status' => $status,
        'date_created' => '<' . $date_before,
        'limit' => -1,
        '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) . ' заказов удалено.';
}

// Пример вызова:
echo delete_woocommerce_orders_by_status_and_date('cancelled', date('Y-m-d', strtotime('-6 months')));

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

  • Зайдите в админку WooCommerce → Заказы, установите фильтр по статусу и дате. Если заказы удалены, они больше не отображаются.
  • Проверьте таблицу wp_posts в базе данных — посты с типом shop_order и удалёнными ID должны отсутствовать.
  • Выполните запрос через WP-CLI:
    wp post list --post_type=shop_order --post_status=cancelled --date_query_column=post_date --before=6 months ago — должен вернуть пустой результат.

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

  • Ошибка: Нет удаляемых заказов.
    Причина: Неверный формат даты или статуса.
    Решение: Убедитесь, что статус соответствует зарегистрированным в WooCommerce (например, 'cancelled', 'completed'). Используйте формат даты 'Y-m-d'.
  • Ошибка: Заказы не удаляются, но возвращается сообщение об успехе.
    Причина: Функция wp_delete_post может возвращать false при ошибке.
    Решение: Добавьте проверку результата удаления и логирование ошибок.
  • Ошибка: Происходит потеря связанного с заказами мета или данных.
    Причина: Использование мягкого удаления (без удаления из базы).
    Решение: Используйте второй параметр true в wp_delete_post($id, true) для полного удаления.

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

  • Всегда делайте резервную копию базы данных перед массовым удалением заказов.
  • Для крупных магазинов запускайте удаление пакетами по 50-100 заказов с паузами, чтобы избежать перегрузки сервера.
  • Вместо удаления старых заказов рассмотрите архивирование в отдельную таблицу или экспорт в CSV.
  • Если нужна регулярная очистка, настройте WP-Cron с аналогичным кодом.
  • Используйте WP-CLI для выполнения массовых операций с меньшей нагрузкой и возможностью автоматизации.

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

СпособПлюсыМинусыКогда использовать
Удаление через WP-CLIБыстро, эффективно, скрипт можно запускать из командной строкиТребует доступа к серверу и командной строкеДля крупных магазинов, регулярных задач
Удаление через PHP-функцию в теме или плагинеУдобно для точечных задач, не требует доступа к серверуМожет перегрузить сервер при большом количестве заказовНебольшие магазины, единичные операции
Удаление вручную из админкиПростота, безопасностьНет фильтрации по дате, трудоёмко при большом количествеМалое количество заказов
Как отключить кэширование WooCommerce на отдельных страницах WordPress
13.05.2026
Как отключить отзывы WooCommerce для отдельных товаров
28.02.2026
Как удалить неиспользуемые темы в WordPress
14.04.2026
Как удалить или отключить XML-RPC в WordPress
17.02.2026
Использование WP-Cron для автоматических задач в WordPress
20.04.2026