В чем суть задачи: удаление заказов или других записей без удаления товаров
В 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или не указать, можно удалить товары. - Удаление без проверки статуса: удаление всех заказов без фильтрации может привести к потере важных данных.
- Отсутствие резервной копии: удаление данных без бэкапа приведёт к невозможности восстановления.
- Удаление не полностью удаляет метаданные: некоторые метаданные заказов остаются, что может влиять на базу данных.
Проверка результата после внедрения
После запуска скрипта:
- Зайдите в раздел «Заказы» в WooCommerce — старые отменённые заказы должны исчезнуть.
- В разделе «Товары» проверьте наличие товаров — все должны остаться.
- Используйте 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-запросы напрямую | Очень быстро | Риск повреждения базы, удаление метаданных | Использовать с осторожностью и бэкапом |
| Плагины очистки | Удобный интерфейс | Могут удалять лишнее, нагрузка | Только проверенные, с возможностью фильтрации |