Диагностика проблемы: зачем удалять закрытые заказы в WooCommerce
В интернет-магазине на WooCommerce с течением времени накапливается большое количество заказов, включая закрытые (статус completed, cancelled, refunded и другие). Это приводит к увеличению размера базы данных, замедлению запросов и нагрузке на сервер. Особенно актуально для крупных магазинов с тысячами заказов.
Проверить количество заказов и их статусы можно через phpMyAdmin или с помощью WP CLI:
wp post list --post_type=shop_order --fields=ID,post_status --format=tableЕсли число закрытых заказов превышает десятки тысяч, стоит рассмотреть автоматизацию их удаления.
Пошаговое решение: автоматическое удаление заказов по статусу и периоду
1. Создаем функцию удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wc_delete_old_closed_orders() {
// Устанавливаем дату удаления (например, заказы старше 180 дней)
$date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));
// Получаем ID заказов со статусами 'completed', 'cancelled', 'refunded'
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-completed', 'wc-cancelled', 'wc-refunded'],
'date_query' => [
[
'before' => $date_threshold,
'inclusive' => true,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - чтобы удалить без возможности восстановления
}
}
}2. Настраиваем регулярное выполнение через WP-Cron
Добавьте запуск функции, например, раз в неделю:
// Регистрируем крон задачу
add_action('wc_delete_old_orders_event', 'wc_delete_old_closed_orders');
if (! wp_next_scheduled('wc_delete_old_orders_event')) {
wp_schedule_event(time(), 'weekly', 'wc_delete_old_orders_event');
}При необходимости можно изменить период на 'daily' или 'monthly'.
3. Запуск задачи вручную для проверки
Для теста можно вызвать функцию напрямую в админке (например, через админский плагин Code Snippets) или временно добавить вызов в functions.php:
add_action('admin_init', function() {
if (current_user_can('administrator') && !get_transient('wc_delete_orders_ran')) {
wc_delete_old_closed_orders();
set_transient('wc_delete_orders_ran', 1, 12 * HOUR_IN_SECONDS);
}
});Проверка результата после внедрения
- Проверьте количество заказов с удаленными статусами в админке WooCommerce — их должно стать меньше.
- Запустите запрос через WP CLI или phpMyAdmin, как в разделе диагностики, чтобы убедиться, что старые заказы удалены.
- Просмотрите логи ошибок сервера, чтобы убедиться, что удаление не вызывает проблем.
Частые ошибки и как их исправить
- Удаление не происходит: проверьте, что событие WP-Cron зарегистрировано и запускается (используйте плагин WP Crontrol).
- Удаление происходит, но заказы остаются: убедитесь, что статус заказов совпадает с указанными в фильтре (
wc-completedи т.п.), не используйте простоcompleted. - Высокая нагрузка при удалении большого количества заказов: разбейте удаление на чанки, например, по 100 заказов за раз, используя пагинацию в
get_posts.
Практические советы по безопасности и производительности
- Используйте параметр
wp_delete_post($order_id, true)для полного удаления без корзины, если уверены, что заказы больше не нужны. - Настройте резервное копирование базы данных перед внедрением автоматического удаления.
- При большом объеме данных удаляйте заказы частями, чтобы не перегружать сервер.
- Убедитесь, что ваши плагины и кастомный код не зависят от удаляемых заказов (например, аналитика или интеграции).
Сравнение способов реализации удаления заказов
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
| Ручное удаление через админку | Удаление заказов вручную через WooCommerce | Просто, не требует кода | Непрактично при большом объеме заказов |
| Автоматический скрипт через WP-Cron | Код, который удаляет заказы по расписанию | Автоматизация, масштабируемость | Требуется тестирование и мониторинг |
| Плагины для очистки базы | Готовые решения от сторонних разработчиков | Удобство, дополнительные функции | Могут быть избыточны, нагрузка на сайт |