Диагностика задачи: зачем удалять заказы по статусу и дате
В WooCommerce накопление большого количества заказов, особенно со статусами вроде "отменён", "в обработке" или "ожидает оплаты", может замедлить работу базы данных и админ-панели. Иногда нужно массово очистить заказы по определённым критериям, например, удалить все отменённые заказы старше 6 месяцев.
В стандартном интерфейсе WooCommerce нет удобного инструмента для массового удаления заказов по дате и статусу, поэтому оптимальным решением станет кастомный PHP-код, который при необходимости можно запустить в админке или через WP-CLI.
Пошаговое решение: удаляем заказы по статусу и дате через код
1. Создаём функцию для выборки заказов
Используем WP_Query с типом записи shop_order, фильтруя по статусу и дате создания заказа:
function get_orders_by_status_and_date( $status, $date_before ) {
$args = [
'post_type' => 'shop_order',
'post_status' => 'wc-' . $status,
'posts_per_page' => -1,
'date_query' => [
[
'before' => $date_before,
'inclusive' => true,
],
],
'fields' => 'ids', // Получим только ID заказов
];
$query = new WP_Query( $args );
return $query->posts;
}2. Функция удаления заказов по ID
Удаляем заказы через wp_delete_post с параметром true для полного удаления из базы:
function delete_orders_by_ids( $order_ids ) {
foreach ( $order_ids as $order_id ) {
wp_delete_post( $order_id, true );
}
}3. Объединяем и запускаем удаление
Пример вызова для удаления отменённых заказов старше 6 месяцев:
$status = 'cancelled';
$date_before = date( 'Y-m-d', strtotime( '-6 months' ) );
$order_ids = get_orders_by_status_and_date( $status, $date_before );
if ( ! empty( $order_ids ) ) {
delete_orders_by_ids( $order_ids );
echo 'Удалено заказов: ' . count( $order_ids );
} else {
echo 'Заказы для удаления не найдены.';
}Как проверить, что удаление сработало
- В админке WooCommerce перейдите в раздел заказов, отфильтруйте по нужному статусу и дате — заказы должны отсутствовать.
- Для проверки через базу данных выполните запрос в phpMyAdmin:
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled' AND post_date < DATE_SUB(NOW(), INTERVAL 6 MONTH);— запрос должен вернуть пустой результат. - Если используете WP-CLI, вызовите
wp post list --post_type=shop_order --post_status=wc-cancelled --date_query='before=6 months ago'до и после удаления.
Частые ошибки и их исправление
- Ошибка: Не удаляются заказы, хотя ID возвращаются.
Причина: Недостаточно прав пользователя, под которым запускается код.
Решение: Запускайте код под администратором, либо через WP-CLI от имени администратора. - Ошибка: Функция
wp_delete_postне удаляет связанные мета-данные.
Решение: По умолчаниюwp_delete_postудаляет мета-данные, но если есть сторонние таблицы, очистите их отдельно. - Ошибка: Скрипт тормозит на большом количестве заказов.
Решение: Разбейте удаление на порции с использованием параметраposts_per_pageи циклом с пагинацией.
Практические советы по безопасности и производительности
- Запускайте большие операции удаления только на тестовом сервере или в нерабочее время.
- Резервное копирование базы данных перед массовым удалением — обязательное условие.
- Для регулярной очистки оформите задачу через WP-Cron с ограничением количества заказов на удаление за один запуск.
- Используйте транзакции базы данных при необходимости для предотвращения повреждений данных.
Сравнение вариантов удаления заказов по статусу и дате
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Простота, не требует кода | Нет фильтрации по дате, долго при большом объёме | Малое количество заказов, единичные удаления |
| Плагин для массового удаления | Удобный интерфейс, можно фильтровать | Может влиять на производительность, риск несовместимости | Средний объём, без программного опыта |
| Кастомный код (описанный в статье) | Точная фильтрация, автоматизация, масштабируемость | Требует навыков разработки, риск ошибок без тестирования | Большие объёмы, регулярные операции, интеграции |