Диагностика проблемы: зачем и когда нужно удалять заказы автоматически
В интернет-магазинах на WooCommerce со временем накапливается большое количество заказов, многие из которых имеют статусы «отменён», «ошибка» или «в ожидании оплаты». Хранение этих заказов влияет на размер базы данных и замедляет работу административной панели. Автоматическое удаление таких заказов по заданным статусам и срокам помогает поддерживать базу в чистоте и улучшает производительность.
Как определить, какие заказы можно удалять
- Статусы заказов: отменённые (cancelled), отклонённые (failed), ожидающие оплаты (pending), обработанные (processing) и т.д.
- Возраст заказа: например, удалять отменённые заказы старше 30 дней, а ожидающие оплаты — старше 7 дней.
- Необходимость архивации: если важна история, лучше не удалять, а архивировать или экспортировать данные перед удалением.
Пошаговое решение: код для автоматического удаления заказов по статусу и срокам
Добавим в functions.php темы или в собственный плагин код, который будет запускаться ежедневно через WP-Cron и удалять устаревшие заказы нужных статусов.
function wpfind_delete_old_orders() {
$statuses_to_delete = array('cancelled', 'failed'); // Статусы для удаления
$days_old = 30; // Возраст заказа в днях
$date_query = array(
'before' => date('Y-m-d', strtotime("-{$days_old} days")),
'inclusive' => true,
);
$args = array(
'post_type' => 'shop_order',
'post_status' => array_map(function($status) { return 'wc-' . $status; }, $statuses_to_delete),
'date_query' => array($date_query),
'fields' => 'ids',
'posts_per_page' => -1,
);
$orders = get_posts($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — удаление без корзины
}
}
add_action('wpfind_daily_delete_orders', 'wpfind_delete_old_orders');
// Регистрируем ежедневное событие, если не зарегистрировано
if (!wp_next_scheduled('wpfind_daily_delete_orders')) {
wp_schedule_event(time(), 'daily', 'wpfind_daily_delete_orders');
}Как проверить, что автоматическое удаление работает
- Зайдите в базу данных (через phpMyAdmin или другой инструмент) и проверьте наличие заказов нужных статусов и даты.
- Запустите функцию вручную, добавив вызов
wpfind_delete_old_orders();в файл и обновив сайт, чтобы проверить удаление. - Проверьте в админке WooCommerce, что устаревшие заказы отсутствуют.
- Посмотрите логи сервера/сайта на наличие ошибок при выполнении WP-Cron.
Частые ошибки и как их исправить
- Не срабатывает WP-Cron: на некоторых хостингах cron не запускается автоматически. Проверьте, запускается ли задача через
wp cron event list(если есть WP-CLI) или настройте серверный cron. - Неправильные статусы заказов: забудьте добавить префикс
wc-к статусам. В коде выше это учтено. - Удаление без бэкапа: всегда рекомендуется сделать экспорт заказов перед массовым удалением.
- Удаление не тех заказов: проверьте условия
date_queryи статусы, чтобы не удалить важные данные.
Практические советы по безопасности и производительности
- Добавьте проверку прав пользователя или среды, если функция запускается не только по cron.
- Если заказов много, разбивайте удаление на части, чтобы избежать таймаутов. Например, удаляйте по 100 заказов за раз, используя параметр
posts_per_page. - Используйте плагины для бэкапа базы, чтобы быстро восстановить данные при ошибках.
- Для более гибкого управления рассмотрите использование плагина Clearfy Pro (ссылка) — он позволяет фильтровать и удалять устаревшие данные безопасно.
Сравнение вариантов удаления заказов
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Ручное удаление в админке | Простота, контроль | Много времени при большом количестве | Маленькие магазины |
| WP-Cron с пользовательским кодом | Автоматизация, гибкость | Нужна настройка cron, возможны ошибки | Средние и большие магазины |
| Плагины очистки базы (Clearfy Pro и др.) | Удобство, дополнительные функции | Платные решения, зависимость от плагина | Любой масштаб |