Диагностика задачи: зачем удалять заказы с устаревшими статусами
В WooCommerce со временем накапливаются заказы с статусами, которые уже неактуальны, например, «отменённые» или «в ожидании оплаты» более месяца. Это замедляет работу сайта, усложняет управление и влияет на отчёты. Очистка таких заказов вручную неудобна и трудозатратна, поэтому автоматизация процесса — лучший выход.
Как автоматически удалять заказы WooCommerce по статусу
Какие статусы и период учитывать
В первую очередь стоит определиться с критериями удаления. Обычно это статусы:
cancelled— отменённые;failed— неудачные;pending— ожидающие оплаты (старше 30 дней);on-hold— в ожидании (старше 30 дней).
Задача — удалять заказы с этими статусами, которые не менялись больше 30 дней.
Пошаговое решение с примером кода
1. Добавим функцию, которая выбирает и удаляет устаревшие заказы.
2. Запустим её через WP-Cron один раз в сутки.
function wpcat_delete_old_woocommerce_orders() {
if (!class_exists('WooCommerce')) {
return;
}
$statuses = array('cancelled', 'failed', 'pending', 'on-hold');
$days_old = 30;
$date_before = date('Y-m-d H:i:s', strtotime('-' . $days_old . ' days'));
$args = array(
'limit' => -1,
'status' => $statuses,
'date_modified' => '<' . $date_before,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление
}
}
// Хук для ежедневного запуска
if (!wp_next_scheduled('wpcat_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wpcat_daily_delete_old_orders');
}
add_action('wpcat_daily_delete_old_orders', 'wpcat_delete_old_woocommerce_orders');Обратите внимание, что мы используем wc_get_orders с параметрами фильтрации по статусам и дате последнего изменения. Функция wp_delete_post с параметром true удаляет заказ без возможности восстановления.
Проверка результата после внедрения
Чтобы проверить работу скрипта:
- В админке WooCommerce откройте заказы с указанными статусами старше 30 дней. Можно подготовить тестовые заказы с нужными параметрами.
- Выполните вручную хук, например, через
do_action('wpcat_daily_delete_old_orders');вfunctions.phpили через WP-CLI:
wp eval 'do_action("wpcat_daily_delete_old_orders");'3. Проверьте, что устаревшие заказы удалились из базы (в админке и в базе данных в таблице wp_posts с типом shop_order).
Частые ошибки и как их исправить
- Заказы не удаляются вовсе: убедитесь, что WooCommerce активен и класс
WooCommerceдоступен. - Скрипт удаляет слишком много заказов: проверьте параметры фильтрации, особенно дату и статус. Возможно, стоит увеличить период или уточнить статусы.
- WP-Cron не работает: проверьте, активен ли WP-Cron на сайте. Для отладки используйте плагин WP Crontrol.
- Удалённые заказы остаются в базе: возможно, включены сторонние плагины, которые блокируют удаление. Попробуйте удалить вручную или отключить конфликтующие плагины.
Практические советы по безопасности и производительности
- Перед автоматическим удалением рекомендуем делать резервные копии базы данных.
- Если заказов очень много, разбивайте удаление на батчи, чтобы избежать превышения лимитов памяти и времени выполнения PHP.
- Для оптимизации используйте WP-CLI, если есть доступ к серверу — это быстрее и надёжнее.
- Для контроля процесса и уведомлений о выполнении можно добавить email-уведомления по результатам работы скрипта.
Сравнение решений: плагин vs собственный код
| Критерий | Плагин (например, WP Bulk Delete) | Собственный код |
|---|---|---|
| Гибкость | Ограничена функциями плагина | Полностью настраиваемо под задачу |
| Производительность | Может загружать сайт при массовом удалении | Можно оптимизировать (батчи, WP-CLI) |
| Безопасность | Зависит от качества плагина | Контролируется разработчиком |
| Зависимости | Требует установки стороннего ПО | Без дополнительных плагинов |
| Автоматизация | Есть, но не всегда гибкая | Можно настроить полностью под расписание |