Проблема: накопление старых заказов и нагрузка на базу данных
В магазинах на WooCommerce с большим оборотом заказов база данных быстро разрастается. Это замедляет работу сайта, увеличивает время резервного копирования и затрудняет управление заказами. Автоматическое удаление старых заказов позволяет поддерживать базу в порядке без постоянного ручного вмешательства.
Диагностика: как определить, что заказам пора на удаление
Для начала нужно понять, какие заказы считаются "старыми" и подлежат удалению. Обычно это заказы со статусом completed, cancelled или refunded, которые не изменялись в течение нескольких месяцев.
Пример запроса для диагностики в базе данных MySQL:
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-cancelled', 'wc-refunded') AND post_date < DATE_SUB(NOW(), INTERVAL 180 DAY);Если в результате тысячи заказов старше 6 месяцев, имеет смысл их удалять.
Пошаговое решение: автоматизация удаления заказов по сроку
1. Создаем функцию удаления старых заказов
Добавьте в файл functions.php вашей темы (лучше дочерней) следующий код:
function wpconsult_delete_old_orders() {
global $wpdb;
$days = 180; // Количество дней для хранения заказов
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-completed', 'wc-cancelled', 'wc-refunded') AND post_date < DATE_SUB(NOW(), INTERVAL %d DAY)",
$days
));
if (!empty($order_ids)) {
foreach ($order_ids as $order_id) {
wp_trash_post($order_id); // Можно заменить на wp_delete_post($order_id, true) для полного удаления
}
}
}2. Создаем WP-Cron задачу для регулярного запуска
Добавьте запуск функции в расписание WordPress:
function wpconsult_schedule_order_cleanup() {
if (!wp_next_scheduled('wpconsult_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpconsult_daily_order_cleanup');
}
}
add_action('wp', 'wpconsult_schedule_order_cleanup');
add_action('wpconsult_daily_order_cleanup', 'wpconsult_delete_old_orders');3. Очистка крон задач при деактивации темы (опционально)
function wpconsult_clear_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpconsult_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpconsult_daily_order_cleanup');
}
}
add_action('switch_theme', 'wpconsult_clear_order_cleanup_schedule');Проверка результата после внедрения
- Запустите вручную функцию
wpconsult_delete_old_orders()через консоль WP-CLI или временно вызовите ее в шаблоне. - Проверьте в админке WooCommerce, что старые заказы перемещены в корзину или удалены.
- Выполните SQL-запрос из раздела диагностики, чтобы убедиться, что таких заказов стало меньше.
- Отслеживайте логи сервера на наличие ошибок при работе cron.
Частые ошибки и их исправление
- Заказы не удаляются: Проверьте, что хук крон задачи зарегистрирован и выполнен. Используйте плагин WP Crontrol для диагностики.
- Удаление не полное:
wp_trash_postперемещает заказ в корзину, но не удаляет сразу. Для полного удаления используйтеwp_delete_post($order_id, true). - Удаляются нужные заказы: Проверьте условие в SQL-запросе и корректность статусов заказов.
- Крон задачи не запускаются: Убедитесь, что на сервере посещают сайт хотя бы раз в сутки, либо настроен системный cron для wp-cron.php.
Практические советы по безопасности и производительности
- Безопасность: Не удаляйте заказы сразу без резервных копий. Используйте корзину для возможности восстановления.
- Производительность: Если заказов очень много, делайте удаление партиями, например по 50 заказов за один запуск, чтобы не нагружать сервер.
- Использование WP-CLI: Для больших магазинов лучше запускать очистку через WP-CLI скрипт по планировщику сервера.
Сравнение способов реализации удаления заказов
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Удаление через WP-Cron и код в functions.php | Автоматизация, гибкость, не требует плагинов | Зависит от посещаемости, возможно нагрузка при большом объеме | Код из статьи |
| Удаление через WP-CLI скрипты | Высокая производительность, контроль через сервер | Требует доступа к серверу и навыков работы с консолью | wp post delete $(wp post list --post_type=shop_order --post_status=wc-completed --date_query='before=180 days ago' --format=ids) --force |
| Плагины очистки базы (например, Clearfy Pro) | Простота настройки, дополнительные функции оптимизации | Платные, могут быть избыточными | Clearfy Pro |