Почему важно удалять завершённые заказы в WooCommerce
С течением времени база заказов WooCommerce может значительно разрастаться, особенно если магазин обрабатывает большое количество транзакций. Это влияет на производительность сайта, увеличивает размер базы данных и усложняет её резервное копирование. Удаление завершённых и старых заказов помогает поддерживать базу в чистоте и ускоряет работу сайта.
Диагностика: как понять, что заказы нужно удалять
Прежде чем приступать к удалению, нужно проверить состояние базы данных и определить, действительно ли накопилось много завершённых заказов.
- Откройте phpMyAdmin или другой инструмент для работы с базой данных.
- Выполните запрос для подсчёта заказов со статусом
completed:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-completed';Если результат — несколько тысяч и более, то имеет смысл автоматизировать удаление.
Пошаговое решение: автоматизация удаления завершённых заказов старше 30 дней
1. Создаём функцию для удаления заказов
Добавим в файл functions.php вашей темы или в кастомный плагин следующий код:
function wpstock_delete_old_completed_orders() {
global $wpdb;
$date = date('Y-m-d H:i:s', strtotime('-30 days'));
// Получаем ID заказов со статусом completed старше 30 дней
$orders = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->prefix}posts WHERE post_type = 'shop_order' AND post_status = 'wc-completed' AND post_date < %s",
$date
));
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - принудительное удаление без перемещения в корзину
}
}2. Запускаем функцию по расписанию с помощью WP-Cron
Добавим планировщик задач (cron) для еженедельного запуска удаления:
// Регистрируем событие при активации темы/плагина
function wpstock_schedule_order_cleanup() {
if (!wp_next_scheduled('wpstock_weekly_order_cleanup')) {
wp_schedule_event(time(), 'weekly', 'wpstock_weekly_order_cleanup');
}
}
add_action('wp', 'wpstock_schedule_order_cleanup');
// Привязываем функцию удаления к событию cron
add_action('wpstock_weekly_order_cleanup', 'wpstock_delete_old_completed_orders');
// Отменяем событие при деактивации темы/плагина
function wpstock_deactivate_order_cleanup() {
$timestamp = wp_next_scheduled('wpstock_weekly_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpstock_weekly_order_cleanup');
}
}Проверка результата после внедрения
- Через админку WooCommerce перейдите в раздел Заказы и отсортируйте по статусу "Завершён".
- Проверьте, что заказы старше 30 дней отсутствуют.
- Для теста можно вручную запустить функцию из консоли WP-CLI:
wp eval 'wpstock_delete_old_completed_orders();'Частые ошибки и как их исправить
- Удаление не происходит: убедитесь, что хук планировщика активирован, проверьте вызов
wp_schedule_event. - Заказы не удаляются полностью: используйте
wp_delete_post($order_id, true);с параметромtrueдля принудительного удаления. - Ошибка в SQL-запросе: используйте подготовленные запросы
$wpdb->prepareдля безопасности и корректности. - Планировщик не срабатывает: на локальных серверах WP-Cron может не работать без посещений сайта — можно настроить системный cron.
Практические советы по безопасности и производительности
- Перед удалением создайте резервную копию базы данных.
- Для больших магазинов выполняйте удаление партиями (например, по 100 заказов за раз), чтобы избежать таймаутов.
- Можно использовать WP-CLI для пакетной очистки, если доступ к SSH есть.
- Ограничьте права пользователя, под которым запускается скрипт, чтобы избежать случайного удаления других данных.
Таблица сравнения способов удаления заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Ручное удаление через админку | Просто и понятно | Много времени при большом объёме заказов | WooCommerce → Заказы → Фильтр → Удалить |
| Автоматическое через WP-Cron + PHP | Автоматизация, не требует вмешательства | Нужна правильная настройка cron | Код в functions.php (пример выше) |
| Удаление через WP-CLI | Очень быстро, можно запускать вручную | Требуется SSH-доступ | wp post delete $(wp post list --post_type=shop_order --post_status=wc-completed --field=ID --date_query_column=post_date --before='30 days ago') |