Диагностика задачи: зачем удалять заказы по клиенту и периоду
В WooCommerce иногда возникает необходимость массово удалить заказы конкретного клиента за определённый период. Например, при тестировании, очистке базы от устаревших заказов или по требованию клиента, который хочет удалить свои данные в рамках GDPR. Стандартного функционала в админке для такой фильтрации и удаления нет, поэтому приходится использовать кастомный код.
Как получить заказы по клиенту и дате
Для начала нужно понять, как идентифицировать заказы клиента и фильтровать их по дате. В WooCommerce заказы — это тип записи shop_order, а данные клиента хранятся в метаполях, например, _customer_user — ID пользователя WordPress. Если заказ сделан гостем, то поле будет пустым, и можно фильтровать по email (_billing_email).
Для фильтрации по дате можно использовать стандартные параметры WP_Query: date_query.
Пример выборки заказов пользователя по ID с датой
$customer_id = 123; // ID пользователя WordPress
$start_date = '2023-01-01';
$end_date = '2023-06-30';
$args = [
'post_type' => 'shop_order',
'posts_per_page' => -1,
'post_status' => 'any',
'meta_query' => [
[
'key' => '_customer_user',
'value' => $customer_id,
'compare' => '='
]
],
'date_query' => [
[
'after' => $start_date,
'before' => $end_date,
'inclusive' => true
]
]
];
$orders_query = new WP_Query($args);
$orders = $orders_query->posts;
Пошаговое решение: как удалить найденные заказы
После выборки заказов их можно удалить программно через функцию wp_delete_post() с параметром true для безвозвратного удаления.
Полный пример функции удаления заказов по клиенту и периоду
function delete_customer_orders_in_period($customer_id, $start_date, $end_date) {
$args = [
'post_type' => 'shop_order',
'posts_per_page' => -1,
'post_status' => 'any',
'meta_query' => [
[
'key' => '_customer_user',
'value' => $customer_id,
'compare' => '='
]
],
'date_query' => [
[
'after' => $start_date,
'before' => $end_date,
'inclusive' => true
]
]
];
$orders_query = new WP_Query($args);
if (empty($orders_query->posts)) {
return 0; // заказов нет
}
$count = 0;
foreach ($orders_query->posts as $order) {
wp_delete_post($order->ID, true); // безвозвратное удаление
$count++;
}
return $count;
}
// Пример вызова:
$deleted = delete_customer_orders_in_period(123, '2023-01-01', '2023-06-30');
echo "Удалено заказов: $deleted";
Как проверить, что удаление прошло успешно
- В админке WooCommerce в разделе «Заказы» проверьте, что заказы пользователя за указанный период отсутствуют.
- В базе данных таблице
wp_postsубедитесь, что записи сpost_type = 'shop_order'и нужнымIDудалены. - Используйте WP_Query с теми же параметрами, чтобы проверить, что запрос не возвращает удалённые заказы.
Частые ошибки и как их исправить
- Пустой результат при выборке заказов: Проверьте корректность ID пользователя и даты. Убедитесь, что заказы действительно существуют в этот период.
- Заказы не удаляются: Возможно, функция
wp_delete_post()не вызывается или возвращает false. Проверьте права пользователя и отсутствие ошибок PHP. - Удаление только части заказов: Убедитесь, что
post_statusустановлен вany, иначе заказы с нестандартным статусом не попадут в выборку. - Удаление заказов гостя по email: В коде выше используется ID пользователя, для гостей нужно фильтровать по метаполю
_billing_email.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы, особенно если удаляете заказы массово.
- Ограничьте количество удаляемых заказов за один запуск, чтобы не перегружать сервер.
- Для удаления гостевых заказов используйте фильтрацию по
_billing_emailи добавьте валидацию email. - Добавьте проверку прав текущего пользователя, чтобы ограничить возможность удаления заказов только администраторам.
- Если нужно часто проводить такие операции, рассмотрите создание WP-CLI команды для удобства и безопасности.
Сравнение способов удаления заказов по клиенту и периоду
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручное удаление через админку | Просто, без кода | Нет фильтрации по периоду, много кликов | Админка WooCommerce → Заказы |
| Кастомный код WP_Query + wp_delete_post() | Точно фильтрует, автоматизация | Требует навыков разработки | Пример в статье |
| Плагины для очистки заказов | Удобный интерфейс | Может быть платным, избыточный функционал | WP Bulk Delete и аналоги |