Диагностика задачи: зачем удалять закрытые заказы в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливаются заказы в разных статусах. Закрытые (completed, cancelled, refunded) заказы обычно не нужны для активной работы, но занимают место в базе данных, замедляя запросы к таблицам wp_posts и wp_postmeta. Автоматическое удаление старых закрытых заказов помогает поддерживать чистоту базы и оптимизировать производительность без потери актуальных данных.
Проверьте, сколько заказов в статусах completed, cancelled или refunded за определённый период (например, старше 180 дней):
SELECT COUNT(ID) 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);Если число большое — имеет смысл автоматизировать удаление.
Пошаговое решение: как настроить автоматическое удаление заказов по времени
1. Создаем функцию удаления заказов по статусам и дате
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function wprus_delete_old_closed_orders() {
global $wpdb;
$statuses = [ 'wc-completed', 'wc-cancelled', 'wc-refunded' ];
$days = 180; // количество дней, старше которых удаляем
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
foreach ($statuses as $status) {
// Получаем ID заказов для удаления
$order_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
$status, $date_threshold
));
if (!empty($order_ids)) {
foreach ($order_ids as $order_id) {
wp_delete_post($order_id, true); // принудительно удаляем вместе с мета
}
}
}
}2. Настраиваем Cron-задачу для регулярного запуска
Добавьте запуск функции ежедневно:
add_action('wprus_daily_order_cleanup', 'wprus_delete_old_closed_orders');
if (!wp_next_scheduled('wprus_daily_order_cleanup')) {
wp_schedule_event(time(), 'daily', 'wprus_daily_order_cleanup');
}3. Очистка Cron при деактивации темы или плагина
Чтобы не создавать «мусор» в расписании задач, добавьте удаление Cron при деактивации:
function wprus_cleanup_cron() {
$timestamp = wp_next_scheduled('wprus_daily_order_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wprus_daily_order_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wprus_cleanup_cron');Проверка результата после внедрения
- Посмотрите в админке WooCommerce → Заказы — старые закрытые заказы должны исчезать через сутки после активации.
- Проверьте таблицы базы данных
wp_postsиwp_postmeta: записи старых заказов должны быть удалены. - Включите логирование для wp_delete_post, если нужно отследить удаление конкретных заказов.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, срабатывает ли Cron. Для теста запустите функцию вручную через wp-cli или вызов напрямую из админки.
- Удаляются не те заказы: перепроверьте статусы и дату в SQL-запросе.
- Удаление занимает много времени: на больших базах разбейте удаление на части, например, обрабатывайте по 100 заказов за запуск.
- Потеря данных нужна частичная: вместо полного удаления используйте смену статуса или архивирование.
Практические советы по безопасности и производительности
- Резервное копирование: перед внедрением автоматического удаления заказов обязательно настройте регулярное резервное копирование базы данных.
- Проверка Cron: используйте плагины Debug Bar или WP Crontrol для мониторинга работы Cron-событий.
- Оптимизация запросов: индексируйте колонки
post_statusиpost_dateдля ускорения выборок. - Логирование действий: добавьте записи в лог при удалении заказов для восстановления при ошибках.
Сравнение вариантов удаления заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудоемко, не подходит для больших объемов |
| Плагин (например, WP Bulk Delete) | Упрощает удаление, настройки через UI | Может влиять на производительность, лишний плагин в системе |
| Код с Cron (предложенный вариант) | Автоматизация, контроль, без лишних плагинов | Требует навыков разработки, настройка Cron |