WordPress Notes WP-1

Удаление заказов 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-функцию в теме или плагинеУдобно для точечных задач, не требует доступа к серверуМожет перегрузить сервер при большом количестве заказовНебольшие магазины, единичные операции
Удаление вручную из админкиПростота, безопасностьНет фильтрации по дате, трудоёмко при большом количествеМалое количество заказов
×
Прокачай свой WordPress!

Скидка -20% на премиум темы и плагины

Воспользоваться сейчас ⋙