Диагностика проблемы с незавершёнными заказами в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending или failed, которые не были завершены пользователями. Это влияет на отчёты, нагрузку на базу данных и может сбивать аналитику. Чтобы избежать этого, полезно настроить автоматическое удаление таких заказов спустя определённое время.
Какие статусы заказов нужно удалять
WooCommerce по умолчанию использует следующие статусы заказов, которые могут быть незавершёнными:
pending— заказ создан, но оплата не началась;failed— оплата не прошла;cancelled— отменён пользователем или администратором;on-hold— временно поставлен на удержание (иногда тоже стоит очищать).
Рекомендуется удалять pending и failed, если они старше, например, 24 часов.
Пошаговое решение: автоматическое удаление заказов через WP Cron
Для автоматической очистки создадим функцию, которая будет запускаться ежедневно и удалять заказы нужных статусов старше заданного времени.
1. Добавление кода в functions.php или в плагин
function wpmarketing_schedule_delete_old_orders() {
if ( ! wp_next_scheduled( 'wpmarketing_delete_old_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpmarketing_delete_old_orders_hook' );
}
}
add_action( 'wp', 'wpmarketing_schedule_delete_old_orders' );
function wpmarketing_delete_old_orders() {
$days = 1; // Удалять заказы старше 1 дня
$statuses = array( 'pending', 'failed' );
$args = array(
'status' => $statuses,
'date_created' => '<' . ( time() - DAY_IN_SECONDS * $days ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
$order = wc_get_order( $order_id );
if ( $order ) {
$order->delete( true ); // true — удалить без возможности восстановления
}
}
}
add_action( 'wpmarketing_delete_old_orders_hook', 'wpmarketing_delete_old_orders' );2. Проверка, что событие запланировано
Выполните в консоли или добавьте временно этот код для отладки:
$timestamp = wp_next_scheduled( 'wpmarketing_delete_old_orders_hook' );
if ( $timestamp ) {
echo 'Запланировано на: ' . date( 'Y-m-d H:i:s', $timestamp );
} else {
echo 'Событие не запланировано';
}Если событие не запланировано, вызовите wpmarketing_schedule_delete_old_orders() вручную.
Проверка результата после внедрения
1. Создайте тестовый заказ со статусом pending или failed.
2. Установите дату создания заказа на более чем 1 день назад через базу данных или с помощью WP CLI:
wp post update <order_id> --post_date='2023-01-01 00:00:00'3. Запустите крон задание вручную:
do_action('wpmarketing_delete_old_orders_hook');4. Проверьте, что заказ удалён. Можно сделать запрос к базе или проверить в админке WooCommerce.
Частые ошибки и как их исправить
- Крон не запускается: Проверьте, работает ли WP Cron. Если сайт с низким трафиком, настройте системный cron для вызова
wp-cron.php. - Заказы не удаляются: Убедитесь, что у функции есть права на удаление. Проверьте, что в запросе используются корректные статусы и формат даты.
- Удаление не происходит вовремя: Проверьте, что событие запланировано и не конфликтует с другими задачами.
- Удаляются лишние заказы: Проверьте аргументы
wc_get_orders, особенно параметрdate_createdи статус.
Практические советы по безопасности и производительности
- Удаляйте заказы с подтверждённым статусом, не трогайте
processingиcompleted. - Для больших магазинов используйте пакетное удаление, чтобы не перегружать базу:
$batch_size = 100;
$orders = wc_get_orders( array( 'status' => $statuses, 'date_created' => '<' . ( time() - DAY_IN_SECONDS * $days ), 'limit' => $batch_size, 'return' => 'ids' ) );- Добавьте логирование удаления для аудита и отладки.
- Рассмотрите использование плагина Clearfy Pro для оптимизации и управления WooCommerce, если нужно более гибкое управление очисткой.
Сравнение способов удаления незавершённых заказов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Ручное удаление в админке | Просто, не требует кода | Трудозатратно, подходит для малого объёма | Использовать для единичных случаев |
| Пользовательский код с wp_cron | Автоматизация, гибкость, бесплатный | Требует навыков, зависит от WP Cron | Лучший вариант для большинства магазинов |
| Плагины для очистки WooCommerce | Простота, дополнительные функции | Могут замедлять сайт, платные | Для больших магазинов с админскими требованиями |