Зачем удалять старые отгруженные заказы в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливается большое количество заказов со статусом «отгружен» (completed). Это может замедлять работу админки, увеличивать размер базы данных и влиять на производительность сервера. Автоматическое удаление таких заказов по истечении определённого срока помогает поддерживать базу в актуальном состоянии без ручной работы.
Диагностика проблемы: как понять, что нужно автоматизировать удаление
Перед автоматизацией убедитесь, что именно старые completed-заказы вызывают нагрузку:
- Проверьте количество заказов в базе: в phpMyAdmin выполните запрос
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-completed'. Если их тысячи или десятки тысяч, это повод для оптимизации. - Оцените размер таблиц
wp_postsиwp_postmetaчерез панель хостинга или с помощью плагина типа WP-Optimize. - Проверьте время загрузки страниц с заказами в админке WooCommerce.
Если нагрузка высокая и база растёт, автоматизация удаления уместна.
Пошаговое решение: создаём cron-задачу для удаления старых заказов
1. Создаём функцию для удаления заказов старше N дней
function wptask_delete_old_completed_orders() {
global $wpdb;
$days = 90; // количество дней для хранения заказов
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID заказов со статусом wc-completed старше $days дней
$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); // принудительное удаление
}
}
}2. Регистрируем cron-задачу, которая будет запускаться ежедневно
function wptask_register_daily_delete_event() {
if (!wp_next_scheduled('wptask_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wptask_daily_delete_old_orders');
}
}
add_action('wp', 'wptask_register_daily_delete_event');
add_action('wptask_daily_delete_old_orders', 'wptask_delete_old_completed_orders');3. Отключаем cron-задачу при деактивации темы или плагина
function wptask_deactivate_clear_cron() {
$timestamp = wp_next_scheduled('wptask_daily_delete_old_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wptask_daily_delete_old_orders');
}
}
register_deactivation_hook(__FILE__, 'wptask_deactivate_clear_cron');Как проверить, что автоматическое удаление работает
- Добавьте временный лог в функцию удаления заказов, например, запись в лог-файл или отправку email с количеством удалённых заказов.
- Запустите вручную функцию
wptask_delete_old_completed_orders()через WP-CLI:wp eval 'wptask_delete_old_completed_orders();'и проверьте, что заказы удалились. - Проверьте через админку WooCommerce или базу данных, что старые completed-заказы исчезли.
- Убедитесь, что cron-задача запланирована: в WP-CLI
wp cron event list | grep wptask_daily_delete_old_orders.
Частые ошибки и как их исправить
- Заказы не удаляются: убедитесь, что статус заказа именно
wc-completed, а неcompletedили другой. WooCommerce использует префиксwc-для статусов. - Удаляются не те заказы: проверьте условие по дате. Важно сравнивать
post_date, а не дату статуса. - Проблемы с производительностью при удалении большого количества заказов: делайте удаление партиями, например, по 50 заказов за раз, чтобы не перегружать сервер.
- Cron-задача не запускается: убедитесь, что на сайте посещения есть для запуска WP-Cron, либо настройте системный cron на вызов
wp-cron.php.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед внедрением автоматического удаления заказов.
- Используйте WP-CLI для ручного запуска и отладки функции удаления.
- Если база очень большая, используйте пакетную обработку с ограничением количества удаляемых заказов за один запуск.
- Добавьте проверку nonce или ограничьте выполнение функции для администраторов, если вызываете удаление вручную.
- Для дополнительной безопасности храните копии важных заказов в отдельной таблице или внешнем хранилище, если они нужны для отчётности.
Сравнение вариантов удаления старых заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку WooCommerce | Просто, не требует кода | Трудозатратно, риск пропустить старые заказы |
| Плагин для удаления заказов (например, WP Bulk Delete) | Удобный интерфейс, гибкие фильтры | Может нагружать сайт, платные версии для автозапуска |
| Код с WP-Cron для автоматического удаления | Автоматизация, контроль над процессом, бесплатный | Требует навыков программирования, настройка cron |