Диагностика проблемы с неоплаченными заказами в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются неоплаченные заказы, которые занимают место в базе и создают путаницу в админке. Это особенно актуально для магазинов с большим потоком покупателей и отложенными платежами. Неоплаченные заказы могут привести к:
- загрязнению базы данных ненужными записями;
- затруднению аналитики и учёта продаж;
- увеличению нагрузки на бэкенд и замедлению админки;
- ошибкам при интеграции с платёжными системами и CRM.
Стандартный WooCommerce не удаляет автоматически такие заказы. Поэтому понадобится кастомное решение.
Пошаговое решение: автоматическое удаление неоплаченных заказов по времени
1. Выбор подходящего хука для автоматизации
Для регулярного удаления неоплаченных заказов используем WP-Cron — внутренний планировщик WordPress. Он запустит функцию очистки по расписанию.
2. Код для удаления неоплаченных заказов старше 24 часов
Добавьте следующий код в functions.php вашей дочерней темы или в кастомный плагин:
function wpsource_delete_unpaid_orders() {
$args = array(
'status' => 'pending', // статус неоплаченного заказа
'date_created' => '<' . ( time() - DAY_IN_SECONDS ), // старше 1 дня
'limit' => -1, // без лимита
'return' => 'ids',
);
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return;
}
foreach ( $orders as $order_id ) {
wp_trash_post( $order_id ); // отправляем заказ в корзину
}
}
// Создаем событие при активации темы/плагина
function wpsource_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpsource_daily_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpsource_daily_order_cleanup' );
}
}
add_action( 'wp', 'wpsource_schedule_order_cleanup' );
// Привязываем функцию к событию
add_action( 'wpsource_daily_order_cleanup', 'wpsource_delete_unpaid_orders' );3. Объяснение кода
- Функция
wpsource_delete_unpaid_ordersнаходит все заказы со статусомpending, созданные более суток назад. - Удаление происходит через
wp_trash_post, чтобы не потерять данные сразу, но можно заменить наwp_delete_postдля полного удаления. - Через
wp_schedule_eventсоздаётся ежедневное событие, которое запускает очистку автоматически.
Проверка результата после внедрения
Чтобы убедиться, что код работает:
- Создайте тестовый заказ со статусом «Ожидает оплаты» (pending).
- Измените дату создания заказа в базе на более старую, чем 24 часа (через phpMyAdmin или WP CLI).
- Запустите wp-cron вручную:
wget -q -O - https://ваш_сайт/wp-cron.php?doing_wp_cronили используйте плагин WP Crontrol. - Проверьте в админке WooCommerce — заказ должен быть перемещён в корзину (Trash).
Частые ошибки и как их исправить
- Код не работает, cron не запускается: Проверьте, включён ли WP-Cron на сайте (опция
DISABLE_WP_CRONне должна быть true). Можно настроить системный cron на сервере. - Заказы не удаляются, хотя подходят под условие: Проверьте правильность статуса заказа. Для неоплаченных чаще всего
pendingилиfailed. Можно расширить фильтр. - Удаляются лишние заказы: Перед удалением добавьте логирование или уведомление, чтобы убедиться, что выборка корректна.
Практические советы по безопасности и производительности
- Не используйте полный
wp_delete_postбез резервного копирования базы, чтобы избежать потери данных. - Добавьте проверку прав пользователя, если хотите запускать очистку вручную через админку.
- Для больших магазинов с тысячами заказов делайте удаление пакетами (например, по 50 заказов за запуск), чтобы не перегружать сервер.
- Используйте плагин как Clearfy Pro для дополнительной очистки и оптимизации WooCommerce без лишнего кода.
Сравнение способов удаления неоплаченных заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + кастомный код | Гибкость, без лишних плагинов, точный контроль | Нужен опыт, требует тестирования, зависит от WP-Cron |
| Плагины для очистки WooCommerce | Простота использования, готовые настройки | Может грузить сайт, лишний софт, меньше контроля |
| Ручное удаление через админку | Простота, отсутствие риска автоматических ошибок | Затратно по времени, не подходит для большого объёма |