Диагностика задачи: зачем и когда нужно массово удалять заказы WooCommerce
Массовое удаление заказов в WooCommerce может понадобиться в нескольких случаях: тестовые продажи после настройки магазина, очистка базы от старых или отменённых заказов, оптимизация базы данных для ускорения работы. Однако стандартные возможности WooCommerce не предусматривают массовое удаление заказов по фильтрам, например, по дате или статусу. В результате приходится искать программные решения или использовать сторонние инструменты.
Как найти заказы WooCommerce по дате и статусу
Для начала нужно идентифицировать, какие именно заказы подлежат удалению. WooCommerce хранит заказы как пользовательские типы записей shop_order. Статусы заказов хранятся как таксономия shop_order_status (например, wc-completed, wc-cancelled, wc-pending).
Для выборки заказов по дате и статусу удобно использовать WP_Query с параметрами:
$args = [
'post_type' => 'shop_order',
'post_status' => 'wc-cancelled', // или массив статусов
'date_query' => [
[
'after' => '2023-01-01',
'before' => '2023-03-31',
'inclusive' => true,
],
],
'posts_per_page' => -1,
];
$query = new WP_Query($args);Так можно получить список ID заказов, подходящих под критерии.
Пошаговое решение: массовое удаление заказов по дате и статусу
Шаг 1. Создаём WP_Query для выборки заказов
function get_orders_to_delete($status, $date_after, $date_before) {
$args = [
'post_type' => 'shop_order',
'post_status' => $status,
'date_query' => [
[
'after' => $date_after,
'before' => $date_before,
'inclusive' => true,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
return $query->posts;
}Шаг 2. Удаляем заказы через wp_delete_post()
function delete_orders_by_ids(array $order_ids) {
foreach ($order_ids as $order_id) {
// true — удаление без возможности восстановления
wp_delete_post($order_id, true);
}
}Шаг 3. Используем вместе
$orders_to_delete = get_orders_to_delete('wc-cancelled', '2023-01-01', '2023-03-31');
delete_orders_by_ids($orders_to_delete);Этот код можно запускать в функции темы, в отдельном плагине или через WP-CLI для безопасности и удобства.
Проверка результата: как убедиться, что заказы удалены
- Зайдите в раздел WooCommerce > Заказы и убедитесь, что заказы с указанными статусами и датами отсутствуют.
- Повторите запрос WP_Query с теми же параметрами — если возвращается пустой массив, значит удаление прошло успешно.
- Проверьте базу данных (таблица
wp_posts, полеpost_type = shop_order) через phpMyAdmin или WP-CLI — заказы должны отсутствовать.
Частые ошибки и как их исправить
- Заказы не удаляются полностью: иногда заказы связаны с метаданными и записями в таблицах WooCommerce. Используйте
wp_delete_post($order_id, true)с вторым параметромtrueдля полного удаления. - Недостаточно прав у пользователя: убедитесь, что код запускается от имени администратора или с правами на удаление записей.
- Неправильный статус заказа: статусы WooCommerce всегда начинаются с
wc-. Например, отменённый заказ —wc-cancelled, завершённый —wc-completed. Если указать простоcancelled, заказы не найдутся. - Проблемы с датами: формат даты должен быть
ГГГГ-ММ-ДД. Для большей точности можно использовать DateTime объекты.
Практические советы по безопасности и производительности
- Резервное копирование: обязательно сделайте бэкап базы перед массовым удалением заказов.
- Используйте WP-CLI: если заказов много, запуск через консоль WordPress WP-CLI удобнее и быстрее, чем через веб-интерфейс.
- Пакетная обработка: если заказов слишком много, разбивайте удаление на части (например, по 100 заказов), чтобы избежать превышения времени выполнения скрипта.
- Логирование: ведите лог ID удалённых заказов, чтобы при необходимости можно было восстановить информацию.
Сравнение способов массового удаления заказов WooCommerce
| Способ | Плюсы | Минусы |
|---|---|---|
| Через пользовательский код (WP_Query + wp_delete_post) | Полный контроль, можно фильтровать по дате, статусу, метаполям | Требуется программирование, риск ошибки без бэкапа |
| Через плагины массового удаления заказов | Удобный интерфейс, не требует кода | Ограниченные фильтры, могут не поддерживать сложные выборки |
| Через WP-CLI | Быстро, можно запускать в командной строке, подходит для больших объёмов | Требует доступа к серверу и понимания консоли |