Проблема зависших платежей в WooCommerce: диагностика
Зависшие платежи — это заказы, которые были созданы, но так и не завершились успешной оплатой. Они могут оставаться в статусах pending, failed или on-hold длительное время, что приводит к:
- загромождению базы данных;
- искажению статистики продаж;
- ошибкам в учёте и отчётности;
- потере возможности повторного оформления.
Чтобы убедиться в наличии таких заказов, выполните запрос к базе данных или используйте SQL-плагин (например, WP-DBManager):
SELECT ID, post_status, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-on-hold') AND post_date < DATE_SUB(NOW(), INTERVAL 7 DAY);Этот запрос покажет все заказы в статусах ожидания, неуспешных или на проверке старше 7 дней.
Автоматизация удаления зависших платежей: пошаговое решение
Шаг 1. Добавляем PHP-скрипт для удаления старых заказов
Создайте или дополните файл functions.php вашей темы или лучше — плагина для пользовательских функций и вставьте следующий код:
function wppay_delete_stale_orders() {
if ( ! current_user_can('manage_woocommerce') ) {
return;
}
$args = array(
'limit' => -1,
'status' => array('pending', 'failed', 'on-hold'),
'date_created' => '<' . ( new WC_DateTime() )->modify('-7 days')->format('Y-m-d H:i:s'),
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
wp_delete_post( $order->get_id(), true );
}
}
// Запускаем раз в сутки через WP-Cron
add_action('wppay_daily_cleanup', 'wppay_delete_stale_orders');
function wppay_schedule_cleanup() {
if ( ! wp_next_scheduled('wppay_daily_cleanup') ) {
wp_schedule_event( time(), 'daily', 'wppay_daily_cleanup' );
}
}
add_action( 'wp', 'wppay_schedule_cleanup' );Этот код удалит все заказы в статусах pending, failed и on-hold, созданные более 7 дней назад. Использование WP-Cron обеспечит ежедневный запуск очистки.
Шаг 2. Ручной запуск и проверка
Для теста можно вызвать функцию вручную из административной части, добавив временно:
add_action('admin_init', function() {
if ( isset($_GET['wppay_cleanup']) ) {
wppay_delete_stale_orders();
wp_die('Удаление зависших заказов выполнено');
}
});Перейдите по URL https://ваш-сайт.ru/wp-admin/?wppay_cleanup=1 чтобы запустить очистку вручную.
Проверка результата после внедрения
- Повторите SQL-запрос из раздела диагностики — количество заказов в статусах
pending,failed,on-holdстарше 7 дней должно быть равно нулю. - В админке WooCommerce в разделе «Заказы» исчезнут старые незавершённые платежи.
- Проверьте логи сервера и ошибок WooCommerce на предмет сбоев.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что функция
wc_get_ordersкорректно возвращает объекты, и что у пользователя есть праваmanage_woocommerce. - Удаляются нужные заказы: убедитесь, что фильтр даты и статусов задан правильно, чтобы не затронуть активные платежи.
- WP-Cron не работает: на некоторых хостингах WP-Cron требует внешних вызовов, настройте реальный cron или используйте плагин для управления задачами.
Практические советы по безопасности и производительности
- Для больших магазинов с тысячами заказов лучше делать удаление партиями (например, по 50 заказов за запуск), чтобы не перегружать сервер.
- Регулярно делайте бэкапы базы данных перед массовыми операциями удаления.
- Для дополнительной безопасности добавьте логирование удалённых заказов в отдельный файл или таблицу.
- Если используете сторонние плагины для платежей, убедитесь, что их статусы совпадают с WooCommerce, чтобы не удалять нужные данные.
Сравнение методов удаления зависших платежей
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное удаление через админку | Удаление заказов вручную через интерфейс WooCommerce | Просто, без кода | Трудоёмко, риск пропуска |
| Автоматизация через WP-Cron + код | Периодический автоматический запуск PHP-скрипта | Автоматизация, чистка базы без вмешательства | Зависит от работы WP-Cron, требует тестирования |
| Использование плагинов очистки | Плагины типа WP Sweep, Clearfy Pro | Удобный интерфейс, дополнительные функции оптимизации | Могут удалять лишнее, зависят от поддержки |