Диагностика проблемы с неоплаченными заказами в WooCommerce
На WooCommerce-магазинах часто возникает ситуация, когда заказы остаются в статусе «В ожидании оплаты» или «Обработка» слишком долго, что приводит к неправильному учету продаж и затрудняет управление запасами и финансами. Особенно это актуально при подключении нескольких платежных систем, где каждая может иметь собственные задержки или особенности обработки платежей.
Для диагностики первой проблемы:
— Проверьте, как долго заказы находятся в статусе ожидания оплаты.
— Определите, какие платежные методы чаще всего вызывают задержки.
— Убедитесь, что статусы заказов корректно обновляются в момент оплаты или отмены.
Для этого можно воспользоваться SQL-запросом к базе данных:
SELECT post_id, meta_value AS payment_method, post_date, post_status
FROM wp_posts
JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
WHERE post_type = 'shop_order'
AND post_status IN ('wc-pending', 'wc-on-hold')
AND meta_key = '_payment_method'
ORDER BY post_date ASC;
Данный запрос выведет заказы в статусах ожидания и на удержании с указанием платежного метода и даты создания.
Пошаговое решение: автоматическое отключение заказов по разным платежным системам
1. Создаем функцию для проверки и обновления статусов заказов
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wplike_auto_cancel_unpaid_orders() {
if ( ! class_exists( 'WC_Order' ) ) {
return;
}
$payment_methods_to_check = array(
'bacs', // Оплата по банковскому переводу
'cheque', // Чек
'cod', // Наложенный платеж
'paypal', // PayPal
'stripe', // Stripe
// Добавьте свои платежные методы здесь
);
$time_limits = array(
'bacs' => 48 * HOUR_IN_SECONDS, // 48 часов
'cheque' => 72 * HOUR_IN_SECONDS, // 72 часа
'cod' => 24 * HOUR_IN_SECONDS, // 24 часа
'paypal' => 12 * HOUR_IN_SECONDS, // 12 часов
'stripe' => 12 * HOUR_IN_SECONDS, // 12 часов
);
$args = array(
'limit' => -1,
'status' => array('pending', 'on-hold'),
'payment_method' => $payment_methods_to_check,
'date_created' => '<' . (time() - max($time_limits)),
);
$orders = wc_get_orders($args);
foreach ( $orders as $order ) {
$payment_method = $order->get_payment_method();
$order_date = $order->get_date_created()->getTimestamp();
$now = time();
if ( isset($time_limits[$payment_method]) ) {
$limit = $time_limits[$payment_method];
if (($now - $order_date) > $limit) {
if (!in_array($order->get_status(), array('cancelled', 'completed', 'refunded'))) {
$order->update_status('cancelled', 'Автоматическая отмена заказа из-за отсутствия оплаты по методу ' . $payment_method);
}
}
}
}
}
add_action('woocommerce_scheduled_sales', 'wplike_auto_cancel_unpaid_orders');
2. Настраиваем Cron для регулярного запуска проверки
Для автоматического выполнения функции добавим собственное событие WP-Cron:
function wplike_schedule_order_cancel_cron() {
if ( ! wp_next_scheduled( 'wplike_cancel_unpaid_orders_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wplike_cancel_unpaid_orders_hook' );
}
}
add_action( 'wp', 'wplike_schedule_order_cancel_cron' );
add_action( 'wplike_cancel_unpaid_orders_hook', 'wplike_auto_cancel_unpaid_orders' );
Этот код запустит проверку каждый час.
Проверка результата после внедрения
- Создайте тестовый заказ с выбранным платежным методом.
- Оставьте его неоплаченным и установите дату создания заказа в прошлом (можно через базу данных или WP-CLI).
- Запустите вручную WP-Cron или дождитесь автоматического запуска.
- Проверьте, что статус заказа изменился на «Отменён».
- Просмотрите логи или комментарии к заказу — там должно появиться сообщение об автоматической отмене.
Частые ошибки и как их исправить
- Заказы не отменяются: Убедитесь, что WP-Cron работает корректно на сервере. Для проверки можно использовать плагин WP Crontrol.
- Некорректные payment_method: Проверьте точное значение ключа
_payment_methodв базе данных, возможно, оно отличается от ожидаемого. - Функция не вызывается: Проверьте, что файл с кодом подключён и нет синтаксических ошибок.
- Статусы заказов не меняются: Проверьте, что у пользователя сайта достаточно прав на изменение статусов заказов.
Практические советы по безопасности и производительности
- Используйте
wc_get_ordersс ограничением по дате и статусу, чтобы не перегружать сервер. - Ограничивайте количество проверяемых платежных методов и период проверки, чтобы избежать излишней нагрузки.
- Для больших магазинов рассмотрите использование систем внешнего планировщика задач (например, системного cron), чтобы повысить надежность.
- Всегда делайте резервное копирование перед внесением изменений в функционал.
Сравнение решений для автоматической отмены заказов
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Простота | Трудозатратно, риск ошибок |
| Плагины для отмены заказов | Удобство, готовые настройки | Могут замедлять сайт, лишний код |
| Кастомный код с WP-Cron | Гибкость, контроль, легковесность | Нужны навыки разработки, настройка cron |