Диагностика проблемы: когда и почему нужно удалять заказы без активности
В интернет-магазинах на WooCommerce часто возникает ситуация, когда пользователи создают заказы, но не завершают оплату или не проявляют дальнейшую активность. Такие заказы занимают ресурсы базы данных, создают путаницу в отчетах и могут влиять на аналитику. Задача — автоматически удалять или отменять такие заказы, основываясь не только на времени создания, но и на отсутствии активности клиента, например, просмотров страницы заказа.
Как определить отсутствие активности по просмотрам заказа
WooCommerce не отслеживает просмотры заказа по умолчанию. Для решения нужно реализовать собственный механизм:
- Записывать в мета-данные заказа время последнего просмотра страницы заказа пользователем.
- Периодически проверять заказы, у которых последний просмотр был давно или его вообще не было.
Это позволит более точно удалять заказы, по которым клиент не проявляет никакой активности.
Добавление записи времени просмотра заказа
Вставьте следующий код в файл functions.php активной темы или в кастомный плагин:
add_action('template_redirect', function() {
if (is_wc_endpoint_url('view-order')) {
$order_id = absint(get_query_var('view-order'));
if ($order_id) {
update_post_meta($order_id, '_last_order_view', current_time('timestamp'));
}
}
});Этот хук срабатывает при просмотре страницы заказа (URL типа /order/view-order/1234/) и обновляет мета-ключ _last_order_view с текущим временем.
Пошаговое решение: автоматическое удаление заказов без активности
Далее необходимо создать WP-Cron задачу, которая будет запускаться по расписанию и удалять заказы с отсутствием просмотров более заданного времени, например, 7 дней:
function wc_delete_inactive_orders() {
$args = [
'limit' => -1,
'status' => ['pending', 'on-hold'],
'meta_query' => [
'relation' => 'OR',
[
'key' => '_last_order_view',
'value' => strtotime('-7 days', current_time('timestamp')),
'compare' => '<=',
'type' => 'NUMERIC',
],
[
'key' => '_last_order_view',
'compare' => 'NOT EXISTS'
]
]
];
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->delete(true); // жесткое удаление
}
}
// Регистрируем крон событие
if (!wp_next_scheduled('wc_delete_inactive_orders_hook')) {
wp_schedule_event(time(), 'daily', 'wc_delete_inactive_orders_hook');
}
add_action('wc_delete_inactive_orders_hook', 'wc_delete_inactive_orders');Объяснение шагов:
- Получаем все заказы со статусами
pendingиon-hold, у которых последний просмотр был более 7 дней назад или отсутствует вовсе. - Удаляем такие заказы с помощью метода
delete(true)— удаление из базы полностью. - Настраиваем ежедневный cron для запуска функции.
Проверка результата после внедрения
Для проверки:
- Создайте заказ с статусом
pendingи не заходите на страницу его просмотра. - Запустите вручную функцию
wc_delete_inactive_orders()или дождитесь срабатывания WP-Cron. - Проверьте, что заказ исчез из админки WooCommerce — значит автоматическое удаление работает.
- Для заказов, которые вы просматривали, они останутся, так как мета
_last_order_viewобновлен.
Частые ошибки и как их исправить
- WP-Cron не срабатывает: Убедитесь, что на вашем хостинге корректно настроен WP-Cron. Для теста можно запустить событие вручную через плагин WP Crontrol или через
wp cron event run wc_delete_inactive_orders_hookв WP-CLI. - Некорректное получение ID заказа: Проверьте, что URL страницы просмотра заказа действительно содержит параметр
view-orderи что функцияget_query_var('view-order')возвращает число. - Удаление заказов не происходит: Проверьте, что у заказов действительно отсутствует или устарело значение
_last_order_view. Можно вывести список таких заказов для отладки.
Практические советы по безопасности и производительности
- Жесткое удаление заказов (
delete(true)) не позволяет восстановить их. При необходимости сначала переводите заказы в отдельный статус или экспортируйте. - При большом количестве заказов добавьте пагинацию в выборку по
wc_get_orders, чтобы избежать превышения лимита памяти. - Храните время в мета-данных в формате timestamp, а не строками даты, для корректного сравнения.
- Отключите удаление заказов в пиковые часы, чтобы не создавать нагрузку на базу данных.
Сравнение вариантов реализации удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление по времени создания заказа | Простая реализация без дополнительного кода | Удаляет заказы даже если клиент активен (просмотрел заказ) |
| Удаление по отсутствию активности (по просмотрам заказа) | Точное удаление заказов без активности клиента | Нужно писать дополнительный код для отслеживания просмотров |
| Использование плагинов очистки базы | Готовое решение без кода | Может быть избыточным и удалять нужные данные |