Диагностика проблемы с накоплением отменённых и просроченных заказов
В интернет-магазинах на WooCommerce часто накапливаются заказы со статусами cancelled и failed, а также просроченные неоплаченные заказы в статусе pending. Это приводит к раздутой базе данных, снижению производительности и затруднениям в аналитике. Особенно это заметно при большом количестве заказов.
Проверить проблему можно так:
- В админке WooCommerce перейдите в Заказы и примените фильтр по статусу
cancelledилиfailed. - Через phpMyAdmin выполните запрос для подсчёта таких заказов:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-failed');
Если количество превышает несколько тысяч, стоит автоматизировать их удаление.
Пошаговое решение: автоматическое удаление заказов по статусам и времени
1. Создаём функцию для удаления заказов старше определённого срока
Добавьте следующий код в файл functions.php вашей темы (рекомендуется создать дочернюю тему) или в кастомный плагин:
function wpload_delete_old_orders() {
global $wpdb;
// Указываем статусы заказов для удаления
$statuses = [ 'wc-cancelled', 'wc-failed', 'wc-pending' ];
// Удаляем только заказы старше 30 дней
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Формируем SQL запрос для выборки ID заказов
$placeholders = implode(',', array_fill(0, count($statuses), '%s'));
$query = $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'shop_order'
AND post_status IN ($placeholders)
AND post_date < %s",
...array_merge($statuses, [$date_threshold])
);
$order_ids = $wpdb->get_col($query);
if (empty($order_ids)) {
return; // Нет заказов для удаления
}
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // Принудительное удаление
}
}
2. Запускаем функцию по расписанию с помощью WP-Cron
Добавьте в functions.php следующий код для регистрации cron задачи и её запуска раз в сутки:
// Регистрация события при активации темы/плагина
if (! wp_next_scheduled('wpload_daily_delete_orders')) {
wp_schedule_event(time(), 'daily', 'wpload_daily_delete_orders');
}
// Привязываем функцию к событию
add_action('wpload_daily_delete_orders', 'wpload_delete_old_orders');
// Для отмены cron (при деактивации плагина/темы)
// wp_clear_scheduled_hook('wpload_daily_delete_orders');
Проверка результата после внедрения
- Перейдите в раздел «Заказы» WooCommerce и примените фильтр по статусам
cancelledиfailed. Количество старых заказов должно уменьшиться после выполнения задачи. - Для немедленной проверки можно вручную вызвать функцию в консоли WP-CLI:
wp eval 'wpload_delete_old_orders();' - Проверьте таблицу
wp_postsчерез phpMyAdmin, чтобы убедиться, что заказы удалены.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте правильность статусов — WooCommerce добавляет префикс
wc-, например,wc-cancelled. - Функция не запускается по расписанию: Убедитесь, что WP-Cron работает, посетите сайт, чтобы активировать cron, или настройте системный cron для вызова
wp-cron.php. - Удаляются не те заказы: Проверьте дату и статус заказа, возможно, стоит скорректировать временной порог.
Практические советы по безопасности и производительности
- Используйте
wp_delete_post( $order_id, true )с параметромtrueдля полного удаления, чтобы не оставлять метаданные и данные заказов. - Для больших баз данных оптимальнее запускать удаление партиями, чтобы избежать таймаутов. Например, добавьте ограничение на 50 заказов за запуск.
- Регулярно создавайте резервные копии базы данных перед автоматическим удалением заказов.
- Если у вас кеширование, очистите кеш после удаления заказов для корректного отображения.
Чек-лист для внедрения автоматического удаления заказов
- Определить статусы заказов для удаления (cancelled, failed, pending).
- Выбрать временной порог для удаления (например, 30 дней).
- Добавить функцию удаления заказов в
functions.phpили плагин. - Настроить WP-Cron для запуска функции ежедневно.
- Проверить работоспособность через админку и WP-CLI.
- Настроить резервное копирование.
- Обеспечить мониторинг работы cron и ошибок.
Сравнение подходов: плагин vs кастомный код
| Метод | Плюсы | Минусы | Рекомендуется |
|---|---|---|---|
| Плагин (например, WP Bulk Delete) | Удобный интерфейс, гибкие настройки, не требует кода | Дополнительная нагрузка, возможные конфликты с другими плагинами | Для новичков и сайтов без разработчика |
| Кастомный код (описанный выше) | Точный контроль, лёгкость интеграции, минимальная нагрузка | Требуется базовое знание PHP и WP-Cron, нужно тестировать | Для разработчиков и оптимизированных проектов |