Проблема: почему важно отключать оплату при неподтверждённых заказах
В интернет-магазинах на WooCommerce часто возникает ситуация, когда пользователь создаёт заказ, но не завершает оплату — например, покидает сайт или не подтверждает заказ в течение определённого времени. Это приводит к "зависшим" заказам, которые блокируют товар на складе и создают путаницу в учёте.
Автоматическое отключение возможности оплаты для таких заказов помогает:
- освободить товар для других покупателей;
- избежать накладок с учётом запасов;
- повысить качество управления заказами в админке WooCommerce.
Диагностика: как определить неподтверждённые заказы
В WooCommerce заказы имеют статус, например pending (ожидает оплаты), processing (в обработке) и другие. Заказы со статусом pending и старше определённого времени считаются неподтверждёнными.
Чтобы проверить такие заказы, можно использовать запрос к базе данных или WP_Query:
$args = [
'post_type' => 'shop_order',
'post_status' => 'wc-pending',
'date_query' => [
[
'column' => 'post_date',
'before' => '24 hours ago',
],
],
'posts_per_page' => -1
];
$pending_orders = get_posts($args);
foreach($pending_orders as $order_post) {
$order = wc_get_order($order_post->ID);
// Дальше логика обработки
}
Решение: как автоматически отключить оплату для неподтверждённых заказов
Реализуем автоматическое изменение статуса заказов, которые остаются в статусе pending дольше 24 часов, на статус cancelled или создадим пользовательский статус payment-disabled, чтобы деактивировать оплату.
Пример кода для добавления WP-Cron задачи, которая ежедневно проверяет и изменяет статусы заказов:
add_action('init', function() {
if (!wp_next_scheduled('wc_check_pending_orders')) {
wp_schedule_event(time(), 'daily', 'wc_check_pending_orders');
}
});
add_action('wc_check_pending_orders', function() {
$args = [
'post_type' => 'shop_order',
'post_status' => 'wc-pending',
'date_query' => [
[
'column' => 'post_date',
'before' => '24 hours ago',
],
],
'posts_per_page' => -1
];
$orders = get_posts($args);
foreach ($orders as $order_post) {
$order = wc_get_order($order_post->ID);
$order->update_status('cancelled', 'Автоматическое отключение оплаты из-за неподтверждения.');
}
});
Если нужно не отменять заказ, а только запретить оплату, можно добавить пользовательский статус и скрывать кнопку оплаты на фронтенде. Это сложнее, но позволяет сохранить заказ для аналитики.
Отключение кнопки оплаты на странице заказа
Пример фильтра, который скрывает оплату для заказов с кастомным статусом payment-disabled:
add_filter('woocommerce_payment_gateways', function($gateways) {
if (is_order_received_page()) {
$order_id = absint(get_query_var('order-received'));
$order = wc_get_order($order_id);
if ($order && $order->get_status() === 'payment-disabled') {
return [];
}
}
return $gateways;
});
Проверка результата после внедрения
- Создайте заказ и оставьте его в статусе
pending. - Подождите 24 часа (или измените код, чтобы проверить с меньшим интервалом).
- Проверьте, что статус заказа изменился на
cancelled(илиpayment-disabled). - Если используется скрытие оплаты, зайдите на страницу оплаты заказа и убедитесь, что кнопка оплаты отсутствует.
- Проверяйте логи cron задач (например, с помощью плагина WP Crontrol).
Частые ошибки и как их исправить
- WP-Cron не запускается: если сайт мало посещаем, cron может не срабатывать. Решение — настроить системный cron на сервере или использовать плагин для внешнего вызова WP-Cron.
- Статус заказа не меняется: проверьте, что используете правильный статус (
wc-pending), и что у пользователя есть права на изменение заказов. - Кнопка оплаты не скрывается: убедитесь, что фильтр подключён, и что условие
is_order_received_page()срабатывает корректно. Можно добавить debug-логи. - Заказы удаляются случайно: не используйте код удаления заказов, только изменение статуса.
Практические советы по безопасности и производительности
- Не удаляйте заказы программно, чтобы сохранить историю и отчёты.
- Используйте системный cron для надёжности выполнения задач.
- Ограничьте выборку заказов в WP_Query, чтобы избежать нагрузок на базу.
- Логируйте изменения статусов в отдельный лог-файл для аудита.
- При добавлении пользовательских статусов следите за совместимостью с плагинами WooCommerce.
Сравнение вариантов реализации автоматического отключения оплаты
| Метод | Описание | Преимущества | Недостатки |
|---|---|---|---|
Изменение статуса на cancelled | Автоматическая отмена неподтверждённых заказов | Простая реализация, полная отмена заказа | Потеря данных о заказе, не всегда желательна |
| Пользовательский статус с отключением оплаты | Сохраняет заказ, но запрещает оплату | Хранение истории, гибкость | Сложнее реализовать, требует корректировки фронтенда |
| Удаление заказов | Полное удаление неподтверждённых заказов | Чистая база данных | Риск потери данных, не рекомендуется |