Диагностика проблемы: зачем и когда нужно удалять завершённые заказы
В WooCommerce количество заказов со временем растёт, особенно если магазин активен. Заказы со статусом completed обычно не требуют изменений, но остаются в базе данных, увеличивая её размер и замедляя запросы, что влияет на производительность сайта. Автоматическое удаление таких заказов по дате поможет поддерживать базу в чистоте без лишних затрат времени.
Как определить, какие заказы удалять
Стандартный подход — удалять заказы со статусом completed, которые старше определённого срока, например, 30 или 90 дней. Важно убедиться, что такие заказы не нужны для отчетности или бухгалтерии, иначе удаление может привести к потере данных.
Проверка заказов в базе
Для начала можно вручную проверить заказы старше 90 дней через SQL-запрос (замените wp_ на префикс вашей таблицы):
SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-completed' AND post_date < DATE_SUB(NOW(), INTERVAL 90 DAY);Этот запрос покажет список заказов, подходящих под критерий удаления.
Пошаговое решение: автоматическое удаление заказов через WP-Cron
Реализуем функцию на PHP, которая удалит заказы старше 90 дней со статусом completed. Затем добавим задачу в WP-Cron для регулярного запуска.
Шаг 1. Создание функции удаления заказов
function wpreset_delete_old_completed_orders() {
global $wpdb;
$date_threshold = date('Y-m-d H:i:s', strtotime('-90 days'));
// Получаем ID заказов для удаления
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'shop_order'
AND post_status = 'wc-completed'
AND post_date < %s",
$date_threshold
));
if (empty($order_ids)) {
return;
}
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // true - без перемещения в корзину
}
}Шаг 2. Регистрация задачи WP-Cron
Добавляем планировщик, который будет запускать удаление раз в сутки.
function wpreset_schedule_order_cleanup() {
if (! wp_next_scheduled('wpreset_daily_order_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wpreset_daily_order_cleanup_hook');
}
}
add_action('wp', 'wpreset_schedule_order_cleanup');
add_action('wpreset_daily_order_cleanup_hook', 'wpreset_delete_old_completed_orders');Шаг 3. Проверка работы
- Зайдите в админку WordPress > Инструменты > Запланированные задачи (если установлен плагин WP Crontrol) и убедитесь, что задача
wpreset_daily_order_cleanup_hookактивна. - Для принудительного теста запустите функцию
wpreset_delete_old_completed_orders()вручную, например, черезfunctions.phpили консоль WP-CLI. - Проверьте, что заказы старше 90 дней со статусом
completedудалены (через админку WooCommerce или SQL-запрос).
Частые ошибки и как их исправить
- Заказы не удаляются. Проверьте, что хук WP-Cron действительно срабатывает. Используйте плагин WP Crontrol для диагностики.
- Удаляются нужные заказы. Убедитесь, что дата и статус указаны корректно. Возможно, стоит увеличить период хранения.
- Ошибка базы данных. Проверьте права доступа к базе и корректность SQL-запроса.
- Функция не подключена. Убедитесь, что код добавлен в активную тему или плагин и не вызывает ошибок.
Практические советы по безопасности и производительности
- Перед удалением заказов сделайте резервную копию базы данных.
- Если база очень большая, удаляйте заказы партиями, чтобы избежать таймаутов. Например, добавьте лимит в SQL и запускайте функцию несколько раз.
- Отслеживайте логи ошибок и работу WP-Cron, чтобы вовремя заметить сбои.
- Чтобы не тормозить сайт, ставьте задачу на низкую нагрузку по времени (например, ночью).
Сравнение способов удаления заказов
| Метод | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно при большом объёме | Подходит для малых магазинов |
| SQL-запросы в базе | Быстро, гибко | Риск удаления лишнего, требует навыков | Использовать с резервным копированием |
| Автоматизация через WP-Cron и PHP | Автоматично, безопасно при правильной настройке | Требует программирования и тестирования | Оптимальный вариант для больших магазинов |
| Плагины очистки базы (например, Clearfy Pro) | Удобный интерфейс, дополнительные функции | Может влиять на производительность, платные | Использовать при необходимости расширенного функционала |