Диагностика проблемы: зачем и когда нужно удалять старые заказы
WooCommerce по умолчанию не удаляет заказы автоматически. Со временем база данных может разрастаться, что замедляет работу сайта и усложняет управление. Особенно актуально удалять заказы со статусами отклонён, отменён или завершён, которые уже не нужны для аналитики или бухгалтерии. Важно определить, какие именно статусы и за какой период можно безопасно удалять.
Чтобы проверить текущее количество заказов по статусам, используйте запрос к базе данных или плагины для администрирования:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Это даст понимание, какие статусы доминируют и сколько заказов можно очистить.
Пошаговое решение: как автоматически удалять старые заказы WooCommerce по статусу
Шаг 1. Определить логику удаления
Например, удалять заказы со статусом cancelled и failed, созданные более 30 дней назад.
Шаг 2. Создать функцию для выборки и удаления заказов
function wc_delete_old_orders_by_status() {
// Даты и статусы
$days = 30;
$statuses = array('wc-cancelled', 'wc-failed');
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'date_query' => array(
'before' => $date,
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true для полного удаления
}
}
}Шаг 3. Запланировать регулярное выполнение
Добавьте cron-задачу WordPress, которая будет запускать удаление раз в неделю:
if (!wp_next_scheduled('wc_delete_old_orders_cron_hook')) {
wp_schedule_event(time(), 'weekly', 'wc_delete_old_orders_cron_hook');
}
add_action('wc_delete_old_orders_cron_hook', 'wc_delete_old_orders_by_status');Проверка результата после внедрения
После запуска скрипта проверьте количество удалённых заказов:
- В админке WooCommerce — уменьшилось ли число заказов со статусами
cancelledиfailed. - Через запрос к базе, аналогичный приведённому выше: число заказов с этими статусами должно уменьшиться.
- Логи cron-задач (можно добавить логирование в функцию удаления для контроля).
Частые ошибки и как их исправить
- orders не удаляются: Проверьте, что статусы указаны с префиксом
wc-(например,wc-cancelled). Без этого заказ не найдётся. - wp_delete_post не удаляет заказы полностью: используйте второй параметр
trueдля полного удаления, иначе заказ перейдёт в корзину. - cron-задача не запускается: убедитесь, что WordPress cron включён и посещают сайт, или настройте системный cron для wp-cron.php.
- слишком много заказов на удаление: для больших баз используйте постраничную обработку (пагинацию), чтобы избежать таймаутов.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных.
- Для больших объёмов заказов используйте batch-обработку с ограничением
posts_per_page. - Логируйте удалённые заказы в отдельный файл для аудита.
- Отключайте скрипт удаления при обновлении WooCommerce, чтобы избежать конфликтов.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудоёмко, не подходит для большого количества | Для единичных случаев |
| Плагин автоматического удаления | Удобно, настройка через UI | Может влиять на производительность, лишние плагины | Если не хотите писать код |
| Кодовая реализация с WP-Cron | Контроль, гибкость, без дополнительных плагинов | Требует навыков, нужно следить за cron | Оптимально для разработчиков |