Диагностика проблемы с неоплаченными заказами в WooCommerce
Неоплаченные заказы в WooCommerce со временем накапливаются, что ведет к загромождению базы данных, замедлению админки и искажающему учету продаж. Особенно актуальна проблема для магазинов с большим трафиком и множеством попыток оплаты, которые так и не были завершены.
Чтобы убедиться в наличии такой проблемы, проверьте в админке WooCommerce раздел Заказы, отфильтровав по статусу on-hold или pending. Если вы видите сотни или тысячи заказов с этими статусами, пора автоматизировать их удаление.
Пошаговое решение: автоматическое удаление неоплаченных заказов
1. Создаем функцию для удаления старых неоплаченных заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в собственный плагин:
function wpsource_delete_unpaid_orders() {
$days = 7; // Удалять заказы старше 7 дней
$date_query = array(
'column' => 'post_date',
'before' => date('Y-m-d H:i:s', strtotime("-{$days} days")),
);
$args = array(
'status' => array('pending', 'on-hold'),
'date_query' => array($date_query),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — удаление без возможности восстановления
}
}
}2. Подключаем функцию к регулярному событию WP-Cron
Добавьте код для запуска функции раз в сутки:
function wpsource_schedule_delete_unpaid_orders() {
if (!wp_next_scheduled('wpsource_daily_delete_unpaid_orders')) {
wp_schedule_event(time(), 'daily', 'wpsource_daily_delete_unpaid_orders');
}
}
add_action('wp', 'wpsource_schedule_delete_unpaid_orders');
add_action('wpsource_daily_delete_unpaid_orders', 'wpsource_delete_unpaid_orders');3. Очистка при деактивации
Чтобы не оставлять запланированные задания после удаления кода, добавьте деактивационный хук:
function wpsource_clear_scheduled_delete() {
$timestamp = wp_next_scheduled('wpsource_daily_delete_unpaid_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpsource_daily_delete_unpaid_orders');
}
}
register_deactivation_hook(__FILE__, 'wpsource_clear_scheduled_delete');Проверка результата после внедрения
- Создайте тестовый заказ со статусом
pendingи выставьте дату на более чем 7 дней назад (например, через phpMyAdmin или плагин для редактирования даты). - Запустите вручную функцию
wpsource_delete_unpaid_orders()через WP-CLI или временно вызовите её в коде. - Проверьте, что заказ удалился из списка в админке.
- Дождитесь автоматического запуска WP-Cron и убедитесь, что старые неоплаченные заказы удаляются регулярно.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически: на некоторых хостингах WP-Cron зависит от посещений сайта. Проверьте логи и настройте системный cron для вызова
wp-cron.phpкаждые 15 минут. - Заказы не удаляются: убедитесь, что статусы указываются корректно и что вы используете WooCommerce 3.0+ (функция
wc_get_ordersс параметромstatus). - Удаление заказов с ошибками: проверьте права пользователя и работы
wp_delete_post. Включите WP_DEBUG для отлова ошибок.
Практические советы по безопасности и производительности
- Настройте интервал удаления с учётом нагрузки сайта — не чаще одного раза в сутки.
- Перед удалением заказов можно сделать резервное копирование базы данных, особенно на живом магазине.
- Если у вас большой магазин, ограничьте количество удаляемых заказов за один запуск (например,
limitвwc_get_orders), чтобы избежать таймаутов. - Используйте
wp_delete_post($order_id, true)для полного удаления, чтобы не оставлять мусор в базе.
Сравнение вариантов удаления неоплаченных заказов
| Вариант | Плюсы | Минусы |
|---|---|---|
| Плагин (например, WooCommerce Cancel Abandoned Order) | Готовое решение, настройки через интерфейс | Дополнительная нагрузка, возможные конфликты, зависит от обновлений |
| Самописный код с WP-Cron (описан выше) | Легковесно, гибко, не требует сторонних плагинов | Требует базовых знаний PHP и WordPress, нужно тестировать |
| Ручное удаление через админку | Простота, подходит для малых магазинов | Затратно по времени, риск пропуска заказов |