Почему нужно автоматически удалять завершённые заказы WooCommerce
В магазинах на WooCommerce с большим количеством заказов база данных быстро разрастается, что может замедлить работу сайта и увеличить время резервного копирования. Автоматическое удаление завершённых (статус «completed») заказов, которым, например, больше 30 дней, помогает оптимизировать базу, освобождая место и улучшая производительность без ручного участия.
Диагностика проблемы: когда и почему заказы не удаляются
Перед автоматизацией важно проверить, что заказы действительно не удаляются вручную и что база не содержит избыточных данных. Иногда заказы могут не удаляться из-за:
- отсутствия прав на удаление постов;
- неправильного статуса заказа для фильтрации;
- конфликтов с плагинами, блокирующими удаление заказов;
- использования кастомных таблиц или нестандартных статусов.
Для проверки текущих заказов с нужным статусом используйте SQL-запрос:
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-completed' AND post_date < NOW() - INTERVAL 30 DAY;Если записи есть, значит удалять есть что.
Пошаговое решение: скрипт для автоматического удаления заказов
1. Создаём функцию удаления заказов по условию
function wpacademy_delete_old_completed_orders() {
global $wpdb;
$days = 30; // удалять заказы старше 30 дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID заказов со статусом completed старше 30 дней
$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)) {
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // true для безвозвратного удаления
}
}
}2. Запускаем функцию через WP-Cron раз в сутки
function wpacademy_schedule_order_cleanup() {
if (!wp_next_scheduled('wpacademy_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpacademy_daily_order_cleanup');
}
}
add_action('wp', 'wpacademy_schedule_order_cleanup');
add_action('wpacademy_daily_order_cleanup', 'wpacademy_delete_old_completed_orders');3. Как добавить ручной запуск (для теста)
// Добавьте в functions.php или плагин
if (isset($_GET['delete_old_orders']) && current_user_can('manage_options')) {
wpacademy_delete_old_completed_orders();
echo 'Старые завершённые заказы удалены';
exit;
}Теперь достаточно перейти на https://example.com/?delete_old_orders=1 (замените example.com на ваш домен) с админской учёткой, чтобы вручную проверить удаление.
Проверка результата после внедрения
- Проверьте в базе данных через phpMyAdmin, что заказы со статусом
wc-completedстарше 30 дней удалены. - Запустите ручной вызов скрипта через GET-параметр и убедитесь в отсутствии ошибок.
- Проверьте логи сервера на наличие ошибок при выполнении WP-Cron.
- Убедитесь, что новые заказы не удаляются преждевременно.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что функция
wp_delete_post()вызывается с параметромtrueдля полного удаления. Убедитесь, что WP-Cron работает (проверьте через плагин WP Crontrol). - Удаляются не те заказы: Проверьте корректность даты и статус заказа. Статус должен быть
wc-completed, а дата — в формате MySQL. - Ошибка доступа при ручном запуске: Убедитесь, что текущий пользователь имеет право
manage_options. - Конфликты с плагинами: Некоторые плагины безопасности могут блокировать удаление постов. Попробуйте временно отключить их и проверить.
Практические советы по безопасности и производительности
- Не удаляйте заказы слишком быстро — установите разумный порог (например, 30 дней), чтобы сохранить историю.
- Используйте WP-Cron, но помните, что он зависит от посещаемости сайта. Для надёжности можно настроить системный cron-задание.
- Регулярно создавайте резервные копии базы перед автоматическим удалением.
- Добавьте логирование удалённых заказов в отдельный файл для аудита.
- Оптимизируйте запросы, чтобы не загружать сервер при большом количестве заказов — разбивайте удаление на партии, если нужно.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Удаление вручную через админку WooCommerce | Просто, без кода | Неэффективно при большом количестве заказов |
| Плагин для очистки заказов | Удобство, дополнительные настройки | Зависимость от стороннего кода, возможные конфликты |
| Код на PHP + WP-Cron (текущее решение) | Лёгко кастомизировать, автономно | Нужно контролировать WP-Cron, требует базовых знаний PHP |