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

В чем суть задачи: удаление заказов или других записей без удаления товаров

В WooCommerce товары и заказы — разные типы записей. Часто возникает необходимость удалить записи заказов, данных клиентов или другие пользовательские записи без затрагивания самих товаров. Классическая проблема — случайное удаление товаров при попытке почистить базу заказов или постов.

Какие типы записей нужны для удаления

В WooCommerce основными типами записей являются:

  • product — товары
  • shop_order — заказы
  • shop_order_refund — возвраты
  • shop_coupon — купоны

Чтобы очистить базу заказов, но оставить товары нетронутыми, нужно работать с типом shop_order.

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

Часто новички удаляют записи через админку WordPress, не фильтруя по типу записи. Если использовать SQL-запросы или WP_Query без фильтрации, можно случайно удалить товары.

Также плагины для очистки базы иногда некорректно обрабатывают типы записей, что приводит к удалению продуктов.

Проверить тип записи можно так:

function check_post_type($post_id) {
    $post_type = get_post_type($post_id);
    error_log('Post ID: ' . $post_id . ' Type: ' . $post_type);
}

Добавьте вызов этой функции для подозрительных записей, чтобы убедиться в типе.

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

Рассмотрим пример удаления всех заказов со статусом cancelled старше 6 месяцев.

Шаг 1. Подключение к WordPress через functions.php или плагин

Лучше создать отдельный плагин для одноразового запуска, чтобы потом отключить.

Шаг 2. Код удаления заказов

function delete_old_cancelled_orders() {
    $date_threshold = date('Y-m-d H:i:s', strtotime('-6 months'));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-cancelled',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date_threshold,
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $orders = get_posts($args);
    if (empty($orders)) {
        error_log('No cancelled orders older than 6 months found');
        return;
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true - принудительное удаление
        error_log('Deleted order ID: ' . $order_id);
    }
}

// Запускаем функцию вручную один раз или по крону
// delete_old_cancelled_orders();

Обратите внимание, что post_type строго shop_order, поэтому товары не удаляются.

Шаг 3. Запуск и проверка

Запустите функцию вручную или через WP-CLI:

wp eval 'delete_old_cancelled_orders();'

Проверка результата:

  • В админке WooCommerce в разделе «Заказы» убедитесь, что старые отменённые заказы исчезли.
  • Проверьте, что товары остались в разделе «Товары».
  • В логах (error_log) будет список удалённых заказов.

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

  • Удаление по неправильному post_type: если указать post_type как post или не указать, можно удалить товары.
  • Удаление без проверки статуса: удаление всех заказов без фильтрации может привести к потере важных данных.
  • Отсутствие резервной копии: удаление данных без бэкапа приведёт к невозможности восстановления.
  • Удаление не полностью удаляет метаданные: некоторые метаданные заказов остаются, что может влиять на базу данных.

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

После запуска скрипта:

  1. Зайдите в раздел «Заказы» в WooCommerce — старые отменённые заказы должны исчезнуть.
  2. В разделе «Товары» проверьте наличие товаров — все должны остаться.
  3. Используйте WP-CLI для проверки количества заказов:
wp post list --post_type=shop_order --post_status=wc-cancelled --field=ID | wc -l

Результат должен быть меньше, чем до удаления.

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

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

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

МетодПлюсыМинусыКомпромисс
Через админкуПросто, визуальноРучной труд, риск ошибкиПодходит для небольших объёмов
WP_Query + wp_delete_postАвтоматизация, точечное удалениеНужны навыки программированияОптимальный для разработчиков
SQL-запросы напрямуюОчень быстроРиск повреждения базы, удаление метаданныхИспользовать с осторожностью и бэкапом
Плагины очисткиУдобный интерфейсМогут удалять лишнее, нагрузкаТолько проверенные, с возможностью фильтрации
Как удалить неиспользуемые метаконтакты в WordPress для оптимизации сайта
01.01.2026
Удаление или отключение AJAX обновлений корзины WooCommerce для оптимизации производительности
22.04.2026
Как удалить записи из WooCommerce без удаления товаров
07.05.2026
Как удалить или изменить метаданные продуктов WooCommerce без плагинов
21.05.2026
Как автоматически удалять неактивных пользователей в WordPress
16.03.2026