Диагностика проблемы: зачем и когда удалять неактивные заказы в WooCommerce
В WooCommerce заказы накапливаются со временем, особенно если сайт работает долго и активно. Неактивные заказы — это обычно статусы pending (ожидание оплаты), failed (неудачный) или cancelled (отменённый), которые долго не меняются и не влияют на продажи. Их хранение увеличивает размер базы данных и замедляет работу административной панели.
Если сайт крупный, можно заметить, что страницы с заказами в админке загружаются медленнее, а резервные копии становятся тяжелее. Избавление от старых неактивных заказов по дате помогает держать базу в чистоте.
Пошаговое решение: автоматическое удаление заказов по дате через Cron и WP-CLI
1. Определение критериев для удаления заказов
В нашем примере удаляем все заказы со статусами pending, failed, cancelled, которые старше 30 дней.
2. Создание функции для удаления заказов
function wpcore_delete_old_inactive_orders() {
$days = 30;
$statuses = array('pending', 'failed', 'cancelled');
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d', strtotime("-{$days} days")),
'inclusive' => true,
);
$args = array(
'post_type' => 'shop_order',
'post_status' => $statuses,
'date_query' => array($date_query),
'fields' => 'ids',
'nopaging' => true,
);
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $order_id) {
wp_trash_post($order_id); // перемещаем заказ в корзину
}
}
}3. Настройка планировщика задач WP-Cron
Добавим событие, которое будет запускать удаление раз в сутки.
add_action('wpcore_daily_delete_orders', 'wpcore_delete_old_inactive_orders');
function wpcore_schedule_delete_orders() {
if (!wp_next_scheduled('wpcore_daily_delete_orders')) {
wp_schedule_event(time(), 'daily', 'wpcore_daily_delete_orders');
}
}
add_action('wp', 'wpcore_schedule_delete_orders');4. Быстрая очистка через WP-CLI
Для больших сайтов ручное удаление через WP-Admin может быть неудобным. Используйте WP-CLI для выполнения скрипта:
wp eval 'wpcore_delete_old_inactive_orders();'Проверка результата после внедрения
- Перейдите в WooCommerce → Заказы и отфильтруйте по статусам
pending,failed,cancelled. Заказы старше 30 дней должны отсутствовать. - Проверьте таблицу
wp_postsв базе данных — старые заказы должны быть в статусеtrash. - Для контроля можно добавить логирование, записывающее ID удалённых заказов в файл.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, что хук
wpcore_daily_delete_ordersправильно регистрируется, и WP-Cron работает (например, через плагин WP Crontrol). - Удаляются не те заказы: Убедитесь, что правильные статусы и временные рамки указаны в
WP_Query. - Проблемы с производительностью: Если заказов слишком много, разделите удаление на части, например, добавив параметр
posts_per_pageи пагинацию. - Заказы остаются в базе: Возможно, используется сторонний плагин, который предотвращает удаление заказов, или заказы защищены от удаления (например, плагином безопасности).
Практические советы по безопасности и производительности
- Перед удалением всегда делайте резервные копии базы данных.
- Используйте функцию
wp_trash_post(), чтобы заказы можно было восстановить из корзины, а не сразу удалять. - Для периодического удаления больших объёмов данных лучше использовать системный Cron на сервере с запуском WP-CLI, чтобы избежать таймаутов на сайте.
- Если хотите полностью удалить заказы (без корзины), используйте
wp_delete_post($order_id, true), но будьте осторожны — данные восстановить будет нельзя. - Добавьте в функцию логирование, чтобы отслеживать успешные и ошибочные удаления.
Сравнение способов удаления старых заказов в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с функцией в теме/плагине | Автоматизация, простая реализация, работает без доступа к серверу | Зависит от посещаемости сайта, может не сработать вовремя |
| WP-CLI скрипт с системным Cron | Надёжность, подходит для больших сайтов, не зависит от посещаемости | Требуется доступ к серверу и знания командной строки |
| Плагины очистки базы (например, WP-Sweep) | Удобный интерфейс, дополнительные функции очистки | Могут удалять лишнее, меньше контроля, нагрузка при массовой очистке |