Диагностика задачи: зачем удалять заказы после возврата
В WooCommerce заказы после возврата часто остаются в базе, занимая место и путая отчёты. Автоматическое удаление таких заказов позволяет поддерживать базу чистой и упрощает аналитику. Но стандартного инструмента для этого нет, поэтому требуется кастомное решение.
Как определить заказы, подходящие для удаления
Для автоматизации удаления нужно чётко понимать, по какому признаку заказы считаются возвращёнными и готовы к удалению. Чаще всего это:
- Статус заказа – например,
refundedили кастомный статус, указывающий на возврат. - Возраст заказа – удаляем только заказы старше X дней, чтобы избежать удаления активных.
Убедитесь, что ваш магазин использует правильный статус возврата. Если стандартного нет, его нужно добавить или использовать метаполе.
Пошаговое решение: автоматическое удаление заказов после возврата
1. Добавьте хук для запуска очистки по расписанию
Используем WP-Cron для запуска функции удаления раз в сутки:
if (! wp_next_scheduled('wpload_delete_refunded_orders_daily')) {
wp_schedule_event(time(), 'daily', 'wpload_delete_refunded_orders_daily');
}2. Напишите функцию удаления заказов
Функция выбирает заказы со статусом refunded старше 7 дней и удаляет их:
function wpload_delete_refunded_orders() {
$args = [
'status' => 'refunded',
'date_created' => '<' . (new WC_DateTime('-7 days'))->getTimestamp(),
'limit' => -1,
'return' => 'ids',
];
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // принудительное удаление заказа
}
}
add_action('wpload_delete_refunded_orders_daily', 'wpload_delete_refunded_orders');3. Проверка работы WP-Cron
Убедитесь, что WP-Cron работает корректно, иначе задача не запустится:
- Включите логирование событий WP-Cron или используйте плагин
WP Crontrolдля проверки запланированных задач. - Можно временно вызвать функцию вручную:
wpload_delete_refunded_orders();через консоль WP-CLI или в функции темы.
Проверка результата после внедрения
- Создайте тестовый заказ, выставьте статус
refunded, подождите несколько секунд или измените дату создания на более раннюю в базе. - Запустите вручную функцию удаления (через WP-CLI или временно вызовите функцию в коде).
- Проверьте, что заказ удалён из админки WooCommerce и базы данных.
- Следите за логами ошибок PHP и WP-Cron.
Частые ошибки и способы исправления
- Заказы не удаляются: проверьте, что статус заказа совпадает с используемым в функции. Иногда статус возврата нестандартный или кастомный.
- WP-Cron не запускается: на некоторых хостингах WP-Cron отключён. Запланируйте системный cron или вызов альтернативного механизма.
- Удаление не полное: обязательно используйте
wp_delete_post($order_id, true)для полной очистки, иначе останутся метаданные и записи.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед внедрением автоматического удаления.
- Используйте ограничение по дате и статусу, чтобы не удалять активные заказы.
- Для больших магазинов реализуйте удаление частями (пагинация), чтобы избежать превышения памяти и таймаута.
- Можно добавить дополнительную проверку на наличие возвратных платежей в метаданных заказа.
Сравнение вариантов решения
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин для очистки заказов | Просто, без кода | Могут быть платными, не всегда гибкие | WP Bulk Delete |
| Кастомный код с WP-Cron | Точная настройка, бесплатный | Требует навыков, WP-Cron может не работать | Пример из статьи |
| Ручное удаление в админке | Безопасно, контроль | Трудозатратно, не подходит для больших объёмов | Админка WooCommerce |