Диагностика проблемы зависших заказов в WooCommerce
Зависшие заказы — это заказы, которые по каким-либо причинам не перешли в статус «завершён» или «отменён» и долго находятся в статусах «обработка», «ожидает оплаты» или «в ожидании». Это создает нагрузку на базу данных и мешает корректной работе магазина, а также может исказить статистику продаж.
Для диагностики используйте SQL-запрос к базе данных WordPress:
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-processing', 'wc-on-hold') ORDER BY post_date ASC;Этот запрос покажет все заказы в статусах, которые чаще всего «зависают». Если количество таких заказов велико (сотни и более), необходимо их чистить.
Пошаговое решение: автоматическое удаление зависших заказов через функции
1. Создание функции очистки заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин для кастомного кода:
function wplancer_delete_stale_orders() {
$days_threshold = 7; // Количество дней, после которых заказ считается зависшим
$statuses_to_delete = array('wc-pending', 'wc-on-hold', 'wc-processing');
$args = array(
'limit' => -1,
'status' => $statuses_to_delete,
'date_created' => '<' . ( time() - DAY_IN_SECONDS * $days_threshold ),
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (empty($orders)) {
return;
}
foreach ($orders as $order_id) {
$order = wc_get_order($order_id);
if ($order) {
// Безопасное удаление заказа
wp_delete_post($order_id, true);
}
}
}2. Автоматизация запуска через WP-Cron
Чтобы функция запускалась автоматически (например, раз в сутки), добавьте в functions.php:
if (!wp_next_scheduled('wplancer_daily_cleanup_orders')) {
wp_schedule_event(time(), 'daily', 'wplancer_daily_cleanup_orders');
}
add_action('wplancer_daily_cleanup_orders', 'wplancer_delete_stale_orders');3. Ручной запуск для проверки
Для тестирования можно вызвать функцию напрямую в админке или через WP-CLI:
wp eval 'wplancer_delete_stale_orders();'Проверка результата после внедрения
Для проверки:
- Запустите SQL-запрос из раздела диагностики до и после удаления — количество зависших заказов должно уменьшиться.
- Проверьте логи ошибок и убедитесь, что нет ошибок при удалении.
- Просмотрите список заказов в админке WooCommerce, чтобы убедиться, что зависшие заказы пропали.
Частые ошибки и как их исправить
- Ошибка: Заказы не удаляются.
Причина: неправильные статусы в массиве$statuses_to_deleteили используется устаревшая версия WooCommerce.
Решение: Проверьте актуальные статусы черезwc_get_order_statuses()и обновите WooCommerce. - Ошибка: Удаляются нужные заказы.
Причина: слишком большой порог по времени или неправильно выбран статус.
Решение: Уменьшите$days_thresholdили уточните статусы для удаления. - Ошибка: WP-Cron не срабатывает.
Причина: на хостинге отключён WP-Cron или мало трафика.
Решение: настройте системный cron для запускаwp-cron.php.
Практические советы по безопасности и производительности
- Удаляйте заказы только после тщательной проверки, чтобы не потерять нужные данные.
- Всегда делайте резервную копию базы перед автоматической очисткой.
- Для сайтов с большим количеством заказов разбивайте удаление на партии, чтобы не перегружать сервер.
- Используйте фильтры WooCommerce, например
'woocommerce_delete_order', чтобы расширять логику удаления. - Отключайте автоматический запуск при отладке, чтобы избежать случайных удалений.
Сравнение вариантов удаления зависших заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудоемко, не подходит для большого количества |
| SQL-запросы напрямую | Быстро, без нагрузки на PHP | Риск повреждения данных, требует навыков |
| Функция + WP-Cron (код) | Автоматизация, безопасность (через WP API) | Нужно тестировать, зависит от WP-Cron |