Диагностика проблемы: когда и зачем удалять старые заказы в WooCommerce
С ростом интернет-магазина на WooCommerce количество заказов в базе данных может достигать десятков и сотен тысяч. Это негативно сказывается на производительности сайта: увеличивается размер базы, замедляется выполнение запросов и резервное копирование. При этом многие старые или отменённые заказы не нужны для дальнейшей работы, если их сохранение не регламентировано законодательством или внутренними процессами.
Задача — регулярно автоматизировать удаление заказов определённого возраста и статуса, а также очистку связанных с ними данных, чтобы сохранить базу компактной и ускорить работу WooCommerce.
Пошаговое решение: как настроить автоматическое удаление заказов в WooCommerce
1. Определяем критерии удаления заказов
Обычно удаляют заказы со статусами cancelled, failed и refunded, которым больше определённого количества дней (например, 30 или 60). Активные или завершённые заказы (completed, processing) обычно не трогаем.
2. Создаём функцию для удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wc_delete_old_orders() {
$days = 30; // количество дней для хранения заказов
$statuses = array('cancelled', 'failed', 'refunded');
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'status' => $statuses,
'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); // перемещаем заказ в корзину
}
}
}3. Автоматизация через cron-задачу WordPress
Добавьте следующий код для регистрации события и запуска его раз в сутки:
if (!wp_next_scheduled('wc_daily_old_orders_cleanup')) {
wp_schedule_event(time(), 'daily', 'wc_daily_old_orders_cleanup');
}
add_action('wc_daily_old_orders_cleanup', 'wc_delete_old_orders');4. Очистка корзины заказов
Удалённые заказы попадают в корзину (статус trash), их стоит периодически окончательно удалять:
function wc_empty_orders_trash() {
global $wpdb;
$wpdb->query(
"DELETE FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'trash'"
);
}
// Очистка корзины раз в неделю
if (!wp_next_scheduled('wc_weekly_empty_orders_trash')) {
wp_schedule_event(time(), 'weekly', 'wc_weekly_empty_orders_trash');
}
add_action('wc_weekly_empty_orders_trash', 'wc_empty_orders_trash');Проверка результата после внедрения
- В админке WooCommerce перейдите в раздел «Заказы» и проверьте, что заказы старше 30 дней со статусами cancelled, failed, refunded исчезли.
- Посмотрите таблицу
wp_posts— записи с post_type =shop_orderи статусомtrashдолжны удаляться раз в неделю. - Используйте плагин Query Monitor для проверки времени выполнения запросов к базе — должно улучшиться.
- Проверьте логи cron-задач через WP Crontrol (плагин) — задачи запускаются как запланировано.
Частые ошибки и как их исправить
- Удаление важных заказов: Некорректно заданы статусы или дата — проверьте переменную
$statusesи дату в коде. - Крон-задачи не запускаются: Убедитесь, что wp-cron активен и на сайте есть трафик, иначе используйте системный cron для вызова wp-cron.php.
- Заказы не удаляются, а только попадают в корзину: Добавьте отдельную задачу для очистки корзины, как показано выше.
- Проблемы с производительностью при удалении большого количества заказов: Делайте удаление партиями по 50-100 заказов, чтобы избежать таймаутов.
Практические советы по безопасности и производительности
- Перед внедрением на рабочем сайте сделайте полную резервную копию базы данных.
- Используйте транзакции или batch-удаления при большом объёме заказов, чтобы избежать потери данных.
- Ограничьте права доступа к функциям удаления заказов, чтобы только администраторы могли запускать эти процессы.
- Оптимизируйте базу данных после удаления заказов с помощью WP-CLI или плагинов типа Clearfy Pro (подробнее).
Сравнение методов удаления заказов: плагин против кода
| Метод | Плюсы | Минусы | Подходит для |
|---|---|---|---|
| Плагин (например WP Bulk Delete) | Простота настройки, графический интерфейс, дополнительные фильтры | Дополнительная нагрузка, зависимость от стороннего кода | Небольшие магазины, администраторы без навыков программирования |
| Кастомный код (cron + wc_get_orders) | Лёгкий, не требует дополнительных плагинов, гибкая настройка | Требует навыков разработки, нужно тестировать | Средние и крупные проекты, разработчики |