Диагностика проблемы неоплаченных заказов в WooCommerce
На интернет-магазинах на WooCommerce часто накапливаются неоплаченные заказы, которые занимают место в базе данных и могут влиять на статистику и отчёты. Это происходит из-за пользователей, которые не завершили оплату, либо из-за технических сбоев платежных шлюзов. Без регулярной очистки таких заказов база растёт, а администраторы тратят время на ручное удаление.
Для диагностики проблемы выполните следующие шаги:
- Перейдите в WooCommerce → Заказы и установите фильтр по статусу
Ожидает оплатыилиon-hold. - Отметьте количество заказов с этими статусами и проанализируйте их возраст: за сколько дней они остаются неоплаченными.
- Проверьте логи платежных систем на предмет сбоев, которые могли привести к незавершённым транзакциям.
Пошаговое решение: автоматическое удаление неоплаченных заказов через код
Чтобы автоматизировать процесс очистки, можно добавить в файл functions.php вашей темы или в отдельный плагин следующий код. Он удаляет заказы со статусом pending старше заданного количества дней (например, 3 дня).
function wpcourse_delete_old_pending_orders() {
if ( ! current_user_can( 'manage_woocommerce' ) ) {
return;
}
$days = 3; // Количество дней ожидания оплаты
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = array(
'status' => 'pending',
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
add_action( 'woocommerce_scheduled_delete_old_pending_orders', 'wpcourse_delete_old_pending_orders' );
// Запускаем очистку раз в сутки
if ( ! wp_next_scheduled( 'woocommerce_scheduled_delete_old_pending_orders' ) ) {
wp_schedule_event( time(), 'daily', 'woocommerce_scheduled_delete_old_pending_orders' );
}Этот код создаёт ежедневное событие, которое удаляет все неоплаченные заказы старше 3 дней. При необходимости можно изменить количество дней, настроив переменную $days.
Проверка результата после внедрения
Чтобы проверить, что автоматическое удаление работает корректно:
- Создайте тестовый заказ с статусом
pendingвручную или через фронтенд. - Измените дату создания заказа в базе данных (например, через phpMyAdmin), чтобы она была старше установленного периода в 3 дня.
- Запустите вручную действие wp-cron, вызвав URL
https://ваш_сайт/wp-cron.phpили через консоль WP-CLI командойwp cron event run woocommerce_scheduled_delete_old_pending_orders. - Проверьте, что заказ исчез из списка заказов.
Частые ошибки и как их исправить
- Отсутствие запуска wp-cron: если на сайте отключён wp-cron или низкая активность, задача может не запускаться. Проверьте настройки cron и при необходимости настройте системный cron на запуск wp-cron.php.
- Неверный статус заказа: в WooCommerce бывают разные статусы неоплаченных заказов (
pending,on-hold). Убедитесь, что в коде указан именно статус, который нужно удалять. - Права доступа: функция
current_user_can('manage_woocommerce')ограничивает выполнение. Если запуск идёт по cron, можно убрать проверку или использовать другой способ проверки. - Удаление заказов с важной информацией: будьте осторожны, чтобы не удалять заказы, которые могут быть в процессе оплаты или возврата. Лучше выставлять небольшое количество дней и внимательно следить за логами.
Практические советы по безопасности и производительности
- Перед внедрением автоматического удаления сделайте резервную копию базы данных.
- Для больших магазинов с тысячами заказов используйте пагинацию в запросах, чтобы не перегружать базу.
- Логируйте удалённые заказы в отдельный файл для аудита и восстановления, если нужно.
- Регулярно проверяйте логи сайта и WooCommerce на предмет ошибок при удалении.
Сравнение способов удаления неоплаченных заказов
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Код на PHP с WP-Cron | Полный контроль, без плагинов | Требует знаний, возможны ошибки | Использовать готовые решения с настройками |
| Плагины очистки WooCommerce | Простота установки, интерфейс | Могут грузить сайт, лишний код | Использовать на небольших сайтах |
| Ручное удаление через админку | Простота, безопасность | Трудозатратно, не автоматично | Использовать для единичных случаев |
Дополнительный код: логирование удалённых заказов
function wpcourse_delete_old_pending_orders() {
$days = 3;
$date = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
$args = array(
'status' => 'pending',
'date_created' => '<' . $date,
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
$log_file = WP_CONTENT_DIR . '/deleted_orders.log';
foreach ( $orders as $order_id ) {
$order = wc_get_order( $order_id );
$data = sprintf( "%s - Удалён заказ #%d, сумма: %s\n", date('Y-m-d H:i:s'), $order_id, $order->get_total() );
file_put_contents( $log_file, $data, FILE_APPEND );
wp_delete_post( $order_id, true );
}
}