Что такое неактивные заказы в WooCommerce и зачем их удалять
Неактивные заказы — это заказы, которые не были оплачены, отменены или находятся в состоянии ожидания оплаты длительное время. Такие заказы накапливаются в базе и могут замедлять работу сайта, особенно если их тысячи. Автоматическое удаление неактивных заказов помогает поддерживать базу данных в порядке и ускорять запросы WooCommerce.
Диагностика проблемы: как определить, что у вас много неактивных заказов
Для начала необходимо понять, есть ли у вас проблема с накоплением неактивных заказов. Это можно сделать через админку WooCommerce:
- Перейдите в WooCommerce > Заказы.
- Отфильтруйте заказы по статусу
отклонён,ожидает оплатыилиотменён. - Посмотрите, сколько таких заказов и когда они были созданы.
Если вы видите сотни и тысячи заказов с этими статусами, которые не меняются месяцами, пора автоматизировать их удаление.
Пошаговое решение: автоматизация удаления неактивных заказов через WP-Cron и код
Для автоматизации удаления добавим кастомный код в файл functions.php вашей темы или лучше в плагин-сниппет.
1. Создаём функцию для удаления заказов старше X дней с нужными статусами
function delete_inactive_wc_orders() {
if ( ! class_exists( 'WC_Order_Query' ) ) {
return;
}
$days = 30; // Кол-во дней для хранения заказов
$statuses = array( 'pending', 'failed', 'cancelled' );
$date = new DateTime();
$date->modify("-{$days} days");
$date_string = $date->format('Y-m-d H:i:s');
$query = new WC_Order_Query( array(
'limit' => -1,
'status' => $statuses,
'date_created' => '<' . $date_string,
'return' => 'ids',
) );
$orders = $query->get_orders();
foreach ( $orders as $order_id ) {
wp_trash_post( $order_id ); // можно использовать wp_delete_post для полного удаления
}
}2. Регистрируем WP-Cron задачу для регулярного запуска
function schedule_delete_inactive_orders() {
if ( ! wp_next_scheduled( 'delete_inactive_wc_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'delete_inactive_wc_orders_hook' );
}
}
add_action( 'wp', 'schedule_delete_inactive_orders' );
add_action( 'delete_inactive_wc_orders_hook', 'delete_inactive_wc_orders' );3. Очистка задачи при деактивации
function unschedule_delete_inactive_orders() {
$timestamp = wp_next_scheduled( 'delete_inactive_wc_orders_hook' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'delete_inactive_wc_orders_hook' );
}
}
register_deactivation_hook( __FILE__, 'unschedule_delete_inactive_orders' );Как проверить, что автоматическое удаление работает
- Добавьте тестовый заказ с одним из статусов
pending,failedилиcancelledи датой создания старше 30 дней (можно вручную изменить дату в базе для теста). - Запустите WP-Cron вручную командой
wp cron event run delete_inactive_wc_orders_hookчерез WP-CLI или дождитесь автоматического запуска. - Проверьте, что заказ переместился в корзину или удалён.
- В админке WooCommerce проверьте, что такого заказа больше нет.
Частые ошибки и их исправление
- Заказы не удаляются: Убедитесь, что у вас включен WP-Cron. Если сайт малопосещаемый, WP-Cron может не запускаться — рассмотрите настройку системного cron на сервере.
- Удаляются не те статусы: Проверьте массив
$statuses, он должен содержать только нужные статусы. Например, не стоит включатьcompletedилиprocessing. - Удаление занимает много времени: При большом количестве заказов поставьте лимит в
WC_Order_Queryи запускайте удаление партиями. - Заказы не попадают в корзину, а вообще не удаляются: Функция
wp_trash_postперемещает в корзину. Для полного удаления используйтеwp_delete_post( $order_id, true ), но будьте осторожны — восстановить удалённые заказы нельзя.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных.
- Не используйте полный
wp_delete_postбез крайней необходимости. - Ограничьте частоту запуска cron задачи до одного раза в день, чтобы не перегружать сервер.
- Если база слишком большая, разбейте удаление на партии по 100-200 заказов.
- Добавьте логирование удалённых заказов для аудита, например, через
error_logили запись в отдельную таблицу.
Сравнение вариантов автоматического удаления неактивных заказов
| Вариант | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин (например, Advanced Order Cleaner) | Простота установки, поддержка интерфейса, настройки без кода | Может быть тяжеловесным, ограниченные настройки, зависимость от плагина | Advanced Order Cleaner |
| Кастомный код с WP-Cron | Максимальный контроль, легковесность, можно адаптировать под любые условия | Требуется базовое знание PHP и WP-Cron, нужна поддержка кода | Код из статьи |
| Ручное удаление через SQL-запросы | Быстро при единовременной очистке | Риск повредить базу, нет автоматизации | |