Как удалить записи из 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-запросы напрямуюОчень быстроРиск повреждения базы, удаление метаданныхИспользовать с осторожностью и бэкапом
Плагины очисткиУдобный интерфейсМогут удалять лишнее, нагрузкаТолько проверенные, с возможностью фильтрации
Как использовать AJAX для обновления контента в WordPress без перезагрузки страницы
29.03.2026
Как удалить неактивных пользователей в WooCommerce
03.07.2026
Как отключить Emoji в WordPress для оптимизации сайта
17.01.2026
Как отключить автоматическое изменение размера изображений в WooCommerce
13.05.2026
Как удалить неиспользуемые варианты продуктов WooCommerce без потери данных
25.06.2026