Диагностика проблемы: зачем и когда нужно удалять заказы автоматически
В WooCommerce со временем накапливаются заказы с различными статусами: отменённые, ожидающие оплаты, просроченные и т.п. Это может привести к перегрузке базы данных, замедлению админ-панели и усложнению аналитики. Автоматическое удаление устаревших заказов избавляет от мусора без ручного вмешательства.
Типичные сценарии:
- Удаление отменённых заказов старше 30 дней;
- Удаление заказов со статусом «ожидает оплаты» старше 7 дней;
- Удаление заказов со статусом «обработка», которые не обновлялись более 60 дней (например, брошенные или зависшие).
Как реализовать автоматическое удаление заказов по статусу и времени
Шаг 1. Создаём WP-Cron задачу для регулярной очистки
Добавим в файл functions.php вашей темы или в кастомный плагин следующий код, который зарегистрирует событие запуска раз в день:
if (! wp_next_scheduled('wpin_delete_old_wc_orders')) {
wp_schedule_event(time(), 'daily', 'wpin_delete_old_wc_orders');
}Шаг 2. Добавляем функцию удаления заказов по статусам и времени
Реализуем функцию, которая будет искать и удалять заказы по заданным правилам:
add_action('wpin_delete_old_wc_orders', 'wpin_delete_old_orders_by_status_and_date');
function wpin_delete_old_orders_by_status_and_date() {
// Настройки: статус => количество дней старости
$statuses_to_delete = [
'cancelled' => 30,
'pending' => 7,
'processing' => 60,
];
foreach ($statuses_to_delete as $status => $days) {
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'status' => $status,
'date_modified' => '<' . $date_threshold,
'limit' => -1,
'return' => 'ids',
];
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - удалить без перемещения в корзину
}
}
}
}Шаг 3. Тестируем функцию вручную
Для проверки можно вызвать функцию напрямую из консоли WP-CLI или временно добавить в functions.php вызов:
add_action('init', function() {
if (current_user_can('administrator') && isset($_GET['test_delete_orders'])) {
wpin_delete_old_orders_by_status_and_date();
exit('Orders deletion test executed');
}
});После этого откройте в браузере https://ваш-сайт.ru/?test_delete_orders под администратором, чтобы проверить работу.
Проверка результата после внедрения
- В админке WooCommerce перейдите в «Заказы» и отфильтруйте по статусам, указанным в настройках;
- Проверьте, что заказы старше указанного времени удалены;
- В базе данных таблицы
wp_postsиwp_postmetaпроверьте отсутствие удалённых заказов (тип записиshop_order); - Просмотрите логи ошибок PHP и WP-Cron на наличие сбоев.
Частые ошибки и как исправить
- Отсутствие запланированного события WP-Cron. Проверьте, что событие
wpin_delete_old_wc_ordersприсутствует через WP-CLI командуwp cron event list. Если нет — удалите и добавьте код регистрации заново. - Неверные параметры в
wc_get_orders. Параметрdate_modifiedс оператором < работает только с правильным форматом даты. Убедитесь в корректности формата ISO 8601. - Недостаточные права на удаление заказов. Код выполняется под правами текущего пользователя WP-Cron. Если проблема возникает, добавьте проверку прав или выполняйте удаление от имени администратора.
- Память и время выполнения скрипта. Если заказов много, удаление может превысить лимиты. Разбейте удаление на партии и используйте
set_time_limit(0)и оптимизируйте запросы.
Практические советы по безопасности и производительности
- Добавляйте логи удаления заказов с указанием ID и времени, чтобы иметь возможность аудита.
- Не удаляйте заказы с важными статусами (например, completed), чтобы не потерять данные для бухгалтерии.
- Используйте WP-CLI для разовых массовых удалений, если заказов очень много.
- Для повышения производительности можно отключить триггеры и кеши WooCommerce на время удаления.
- Регулярно делайте резервные копии базы данных перед массовыми удалениями.
Сравнение методов удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP-Cron + wc_get_orders + wp_delete_post | Полный контроль, интеграция с WP, автоматизация | Нагрузка при больших объёмах, требует правильной настройки Cron |
| SQL-запросы напрямую к базе | Быстрое удаление, подходит для больших объёмов | Риск удалить лишнее, требует знаний структуры базы, обходит логику WP |
| Плагины очистки заказов (например, Advanced Database Cleaner) | Удобство и готовые интерфейсы | Могут быть ограничены в кастомизации, нагрузка на сайт |