Что такое незаконченые заказы в WooCommerce и зачем их удалять
В WooCommerce незаконченые или «зависшие» заказы — это записи, которые создаются, но не завершаются пользователем: например, пользователь начал оформление, но не оплатил заказ. Такие заказы занимают место в базе данных, могут замедлять админку и мешать аналитике продаж. Автоматическое удаление таких заказов помогает поддерживать базу в чистоте и оптимизировать работу магазина.
Диагностика проблемы с незаконченными заказами
Для начала нужно определить, есть ли у вас такие заказы и сколько их. В админке WooCommerce перейдите в раздел Заказы и отфильтруйте по статусам pending, failed, on-hold. Обратите внимание на заказы с датой создания более 24-48 часов назад — они с большой вероятностью уже неактивны.
Для более точной диагностики можно выполнить SQL-запрос к базе данных:
SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < NOW() - INTERVAL 2 DAY;Если таких заказов много (сотни и более), это повод автоматизировать их удаление.
Пошаговое решение: как автоматически удалять незаконченые заказы WooCommerce
1. Создаем функцию удаления заказов старше N дней
function wpacademy_delete_old_unpaid_orders() {
$days_to_keep = 2; // количество дней для хранения заказов
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-failed'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date_threshold,
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // перемещаем заказ в корзину
}
}
}2. Добавляем крон-задачу для регулярного запуска
Добавьте следующий код в functions.php вашей темы или в кастомный плагин:
if (!wp_next_scheduled('wpacademy_daily_delete_old_orders')) {
wp_schedule_event(time(), 'daily', 'wpacademy_daily_delete_old_orders');
}
add_action('wpacademy_daily_delete_old_orders', 'wpacademy_delete_old_unpaid_orders');Этот код будет запускать функцию удаления один раз в сутки.
3. Очистка корзины с удаленными заказами (опционально)
WooCommerce перемещает заказы в корзину, но они не удаляются сразу. Чтобы полностью удалить, добавьте:
function wpacademy_empty_trash_orders() {
global $wpdb;
$wpdb->query("DELETE FROM $wpdb->posts WHERE post_type = 'shop_order' AND post_status = 'trash'");
}
add_action('wpacademy_daily_delete_old_orders', 'wpacademy_empty_trash_orders', 20);Проверка результата после внедрения
- Через 1-2 дня проверьте раздел Заказы в админке — старые заказы со статусами
pendingиfailed, которым больше 2 дней, должны исчезнуть. - В базе данных выполните SQL-запрос из раздела диагностики — он не должен возвращать такие заказы.
- Проверьте логи Cron или используйте плагин WP Crontrol для контроля выполнения задач.
Частые ошибки и как их исправить
- Заказы не удаляются: Убедитесь, что cron-задание зарегистрировано и запускается. Проверьте, нет ли ошибок в логах PHP.
- Удаляются нужные заказы: Проверьте, что статус заказа указан правильно. Не используйте статус
processingилиcompletedв фильтре. - Заказы остаются в корзине: Добавьте функцию очистки корзины, как показано выше.
- Функция сильно нагружает сервер: Ограничьте количество удаляемых заказов за один запуск, добавив параметр
'posts_per_page' => 50и запуск крон чаще, например, каждые 6 часов.
Практические советы по безопасности и производительности
- Создавайте резервные копии базы данных перед внедрением автоматического удаления заказов.
- Используйте транзакции и проверяйте права пользователя, если расширяете функционал для админов.
- Для крупных магазинов с тысячами заказов лучше запускать удаление партиями, чтобы снизить нагрузку на сервер.
- Если не хотите писать код, рассмотрите плагины типа Clearfy Pro, которые включают инструменты для очистки базы WooCommerce.
Таблица сравнения методов удаления незаконченых заказов WooCommerce
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| Код на PHP с WP-Cron | Гибкость, бесплатность, контроль | Нужно писать код, возможна нагрузка | Для разработчиков и магазинов со средней нагрузкой |
| Плагин Clearfy Pro | Простота, дополнительные функции оптимизации | Платный, лишние функции, если нужны только заказы | Для тех, кто хочет комплексное решение без кода |
| Ручное удаление через админку | Простота, нет риска ошибок кода | Трудоемко, не автоматизировано | Маленькие магазины с редкими случаями |