Диагностика проблемы: зачем удалять отменённые заказы с задержкой
В WooCommerce отменённые заказы остаются в базе данных навсегда, что со временем увеличивает размер таблиц и может замедлять работу сайта. Но мгновенное удаление заказов при отмене может быть рискованным — иногда нужно подождать, чтобы сохранить историю или дать время на возврат средств. Поэтому задача — автоматизировать удаление отменённых заказов с определённой задержкой, например через 7 дней после отмены.
Как настроить автоматическое удаление отменённых заказов с задержкой
1. Использование WP-Cron для планирования задачи
В WordPress есть встроенный механизм планировщика задач — WP-Cron. Мы создадим функцию, которая будет запускаться раз в сутки и удалять заказанные с статусом cancelled старше 7 дней.
2. Код для автоматического удаления заказов
function wptricks_delete_cancelled_orders() {
$days = 7; // число дней задержки
$date = date('Y-m-d H:i:s', strtotime("-" . $days . " days"));
// Запрос заказов со статусом cancelled старше $days
$args = array(
'status' => 'cancelled',
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // помещаем заказ в корзину
// для полного удаления можно использовать wp_delete_post($order_id, true);
}
}
}
// Регистрируем событие, если оно ещё не запущено
if (!wp_next_scheduled('wptricks_daily_delete_cancelled_orders')) {
wp_schedule_event(time(), 'daily', 'wptricks_daily_delete_cancelled_orders');
}
add_action('wptricks_daily_delete_cancelled_orders', 'wptricks_delete_cancelled_orders');3. Как вручную запустить задачу для теста
Добавьте в функции временный вызов:
// Для теста
wptricks_delete_cancelled_orders();Не забудьте удалить этот вызов после проверки, чтобы избежать двойных запусков.
Проверка результата после внедрения
- Зайдите в WooCommerce - Заказы и отфильтруйте по статусу «Отменён». Заказы, которым больше 7 дней, должны исчезнуть после запуска задачи.
- Для проверки можно вручную изменить дату создания тестового заказа на более раннюю через базу данных или плагины для редактирования заказов.
- Проверьте wp_cron, например, с помощью плагина WP Crontrol, что задача
wptricks_daily_delete_cancelled_ordersзапланирована и выполняется.
Частые ошибки и способы их исправления
- Задача не запускается — WP-Cron зависит от посещений сайта. Для гарантированной работы настройте системный cron на сервере или используйте плагин WP Crontrol для отладки.
- Заказы не удаляются — проверьте, что у вас есть права на удаление заказов. Если используете
wp_trash_post, заказы попадают в корзину, но не удаляются физически. Для полного удаления применяйтеwp_delete_post($order_id, true). - Некорректное определение даты — проверьте формат даты и часовой пояс сайта в настройках WordPress, чтобы правильно считать 7 дней.
- Проблемы с производительностью — при большом количестве заказов ограничьте число удаляемых заказов за один запуск, добавив параметр
'limit' => 50и реализовав пагинацию.
Практические советы по безопасности и производительности
- Сохраняйте резервные копии базы данных перед внедрением автоматического удаления заказов.
- Не удаляйте заказы мгновенно — всегда используйте задержку, чтобы избежать потери важных данных.
- Добавьте логирование удалённых заказов, например, через error_log или отдельный файл, чтобы иметь историю действий.
- Для сайтов с большим потоком заказов подумайте о реализации пакетной обработки с ограничением количества заказов для удаления за один запуск.
- Если вы используете плагин Clearfy Pro от WPShop, можно дополнительно очистить базу от мусорных данных и оптимизировать таблицы.
Сравнение вариантов удаления отменённых заказов
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| WP-Cron + wp_trash_post | Безопасно, заказы можно восстановить из корзины | Заказы не удаляются физически, занимает место | В статье выше |
| WP-Cron + wp_delete_post(true) | Полное удаление, экономия места | Нельзя восстановить после удаления | wp_delete_post($order_id, true); |
| Ручное удаление через админку | Контроль действий | Не автоматизировано, трудозатратно | Нет кода |