Диагностика проблемы: зачем и когда нужна автоматическая очистка заказов
Магазины на WooCommerce с большим количеством заказов могут столкнуться с проблемой разрастания базы данных. Старые, завершённые или отменённые заказы занимают место, что замедляет работу сайта и усложняет бэкапы. Ручное удаление заказов — трудоёмкий процесс, особенно при большом объёме.
Задача: автоматизировать удаление заказов по определённому статусу (например, 'completed', 'cancelled') и по дате (старше 30, 60 дней и т.д.) с учётом безопасности и производительности.
Пошаговое решение: удаление заказов через WP-Cron и собственный PHP-скрипт
1. Создаём функцию для удаления заказов по статусу и дате
Мы воспользуемся классом WC_Order_Query для выборки заказов и методом wp_delete_post() для их удаления.
function wps_delete_old_orders_by_status_date() {
$statuses_to_delete = array('completed', 'cancelled'); // Статусы заказов для удаления
$days_old = 60; // Кол-во дней, старше которых заказы будут удаляться
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_old} days"));
foreach ($statuses_to_delete as $status) {
$query = new WC_Order_Query(array(
'limit' => -1,
'status' => $status,
'date_created' => '<' . $date_threshold,
'return' => 'ids',
));
$order_ids = $query->get_orders();
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // true — принудительное удаление
}
}
}2. Добавляем WP-Cron задачу для регулярного запуска функции
Чтобы запускать очистку автоматически, добавим событие в WP-Cron, например, раз в сутки.
add_action('wps_daily_delete_old_orders', 'wps_delete_old_orders_by_status_date');
function wps_schedule_daily_order_deletion() {
if (!wp_next_scheduled('wps_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wps_daily_delete_old_orders');
}
}
add_action('wp', 'wps_schedule_daily_order_deletion');3. Как отменить планировщик при необходимости
function wps_clear_scheduled_order_deletion() {
$timestamp = wp_next_scheduled('wps_daily_delete_old_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wps_daily_delete_old_orders');
}
}Проверка результата после внедрения
- В админке WordPress переходите в WooCommerce > Заказы и фильтруйте по статусам 'completed' или 'cancelled'.
- Проверьте, что заказы старше указанного срока (60 дней) удалены.
- Для отладки можно временно добавить логирование в функцию удаления:
и смотреть логи сервера.error_log('Удалён заказ ID: ' . $order_id); - Проверяйте работу WP-Cron с помощью плагина WP Crontrol, чтобы убедиться, что задача запускается.
Частые ошибки и как их исправить
- Удаление не происходит: возможно, WP-Cron не работает из-за отсутствия посетителей сайта. Решение: настроить системный cron на сервере или запускать WP-Cron вручную.
- Удаляются не те заказы: проверьте правильность указания статусов (используйте точные ключи WooCommerce, например 'completed', а не 'завершён').
- Слишком долгий процесс удаления: если заказов много, удаляйте партии по 50-100 заказов за раз, чтобы избежать таймаутов. Для этого в запросе укажите
'limit' => 50и запускайте функцию циклично. - Потеря данных важных заказов: добавьте резервное копирование перед удалением. Включите проверку даты и статуса, чтобы исключить случайные удаления.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post($order_id, true)для полного удаления, включая метаданные и связанные записи. - Добавьте проверку прав пользователя или условий запуска при ручном вызове, чтобы избежать несанкционированного удаления.
- Рекомендуется запускать удаление в ночное время, чтобы снизить нагрузку на сервер.
- Для больших магазинов рассмотрите удаление через WP-CLI — это быстрее и надёжнее.
- Обязательно делайте резервное копирование базы данных перед внедрением автоматической очистки.
Сравнение способов удаления заказов WooCommerce
| Способ | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление из админки | Просто, не требует кода | Много времени при большом объёме, риск ошибок | Маленькие магазины, единичные случаи |
| PHP-скрипт с WP-Cron (как в статье) | Автоматизация, гибкость, не требует сторонних плагинов | Зависит от правильной настройки WP-Cron, нагрузка на сайт | Средние и крупные магазины с регулярной очисткой |
| WP-CLI скрипт | Быстро, эффективно для больших баз | Требуется доступ к серверу и знания командной строки | Большие магазины, системные администраторы |