Диагностика проблемы с неактивными заказами в WooCommerce
В крупных интернет-магазинах на WooCommerce накапливаются заказы в статусах, не требующих обработки (например, "отменён", "ожидает оплаты" длительное время). Это приводит к раздутию базы данных, снижению производительности и усложнению администрирования. Чтобы избежать этого, необходимо регулярно удалять неактивные заказы автоматизировано.
Какие статусы заказов стоит считать неактивными для удаления
Перед автоматизацией важно определить, какие заказы можно удалять без риска потери данных:
- cancelled — отменённые заказы;
- failed — неудачные оплаты;
- pending — ожидающие оплаты заказы, которые не были оплачены в течение длительного времени (например, 30 дней);
- on-hold — отложенные заказы без дальнейших действий.
Удалять завершённые, обработанные или оплаченные заказы нельзя.
Пошаговое решение: автоматическое удаление заказов с WP-CLI и Cron
1. Создаём PHP-функцию для удаления заказов по статусу и дате
function wc_delete_inactive_orders( $statuses = array('cancelled', 'failed'), $days_old = 30 ) {
if ( ! class_exists('WC_Order_Query') ) {
return;
}
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . intval($days_old) . ' days'));
$query = new WC_Order_Query( array(
'limit' => -1,
'status' => $statuses,
'date_modified' => '<' . $date_threshold,
'return' => 'ids',
) );
$orders = $query->get_orders();
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // Полное удаление заказа
}
return count($orders);
}2. Создаём WP-CLI команду для запуска удаления вручную и по Cron
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command( 'wc delete_inactive_orders', function( $args, $assoc_args ) {
$statuses = isset($assoc_args['statuses']) ? explode(',', $assoc_args['statuses']) : ['cancelled','failed'];
$days = isset($assoc_args['days']) ? intval($assoc_args['days']) : 30;
$count = wc_delete_inactive_orders($statuses, $days);
WP_CLI::success( "Удалено $count заказов со статусами: " . implode(', ', $statuses) . ", старше $days дней." );
} );
}3. Добавляем Cron-задачу для регулярного запуска
Добавьте в functions.php или в свой плагин следующий код:
if ( ! wp_next_scheduled( 'wc_delete_inactive_orders_cron' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_inactive_orders_cron' );
}
add_action( 'wc_delete_inactive_orders_cron', function() {
wc_delete_inactive_orders(['cancelled','failed','pending'], 30);
} );Как проверить, что автоматическое удаление работает
- Запустите WP-CLI команду вручную:
wp wc delete_inactive_orders --statuses=cancelled,failed --days=30, проверьте вывод и наличие удалённых заказов в админке. - Проверьте наличие Cron-задачи в разделе
wp cron event listили через плагин WP Crontrol. - Просмотрите логи сервера и базу данных, убедитесь, что заказы со статусами из списка и старше 30 дней исчезли.
Частые ошибки и способы их исправления
- Ошибка: Заказы не удаляются
Причина: нет прав на удаление или неверный ID.
Решение: убедитесь, что код выполняется с достаточными правами, и чтоwp_delete_postвызывается с параметромtrueдля полного удаления. - Код не работает с WP-CLI
Причина: WP-CLI не подключён или команда не зарегистрирована.
Решение: проверяйте, что WP-CLI доступен и код с добавлением команды загружается. - Удаляются активные или нужные заказы
Причина: неверно указаны статусы или период.
Решение: внимательно проверьте список статусов и логику фильтрации по дате.
Практические советы по безопасности и производительности
- Перед удалением рекомендуем делать резервные копии базы данных.
- Для больших магазинов запуск скрипта лучше делать ночью, чтобы избежать нагрузки.
- Ограничивайте количество удаляемых заказов за один проход, если база очень большая, добавив параметр
limitвWC_Order_Query. - Используйте отдельный лог для записей об удалении заказов, чтобы отслеживать работу скрипта.
Сравнение вариантов автоматического удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин автоматического удаления | Удобство, готовый интерфейс | Может замедлять сайт, ограниченные настройки |
| Код с WP-CLI и Cron | Гибкость, контроль, высокая производительность | Требуется техническое знание, настройка |
| Ручное удаление в админке | Просто, без кода | Трудоёмко, не подходит для масштабного сайта |