Диагностика проблемы: зачем отключать оплату при неподтверждённых заказах
В стандартной работе WooCommerce заказ считается «в ожидании» до тех пор, пока пользователь не завершит оплату или администратор не подтвердит заказ вручную. Однако это может привести к проблемам с резервированием товаров и загрузкой системы, если таких заказов много и они остаются в подвешенном состоянии.
Пользователи и администраторы хотят автоматизировать процесс отключения возможности оплаты для таких заказов через определённое время, чтобы избежать блокировки товара и снизить нагрузку на обработку заказов.
Как определить неподтверждённые заказы и таймаут отключения оплаты
В WooCommerce статус заказов, ожидающих оплаты, обычно pending или on-hold. Для автоматического отключения оплаты нужно понимать, сколько времени заказ остаётся в таком статусе. Обычно разумный таймаут — 24 часа, но можно настроить индивидуально.
Узнать статус заказа и время создания можно так:
$order = wc_get_order( $order_id );
$status = $order->get_status();
$created = $order->get_date_created();
// $created - объект DateTime
Пошаговое решение: отключение оплаты для неподтверждённых заказов
1. Создаём функцию для проверки и обновления статусов
Нужно написать функцию, которая будет запускаться по крону (wp_cron) и менять статус неподтверждённых заказов на «отменён» или «отклонён» после истечения таймаута. Это автоматически предотвратит дальнейшую оплату.
function wptasks_auto_cancel_unpaid_orders() {
$timeout_hours = 24; // Время ожидания в часах
$args = array(
'status' => array('pending', 'on-hold'),
'limit' => -1,
'date_created' => '<' . ( new WC_DateTime( '-'. $timeout_hours .' hours' ) )->date('Y-m-d H:i:s'),
);
$orders = wc_get_orders($args);
foreach ($orders as $order) {
$order->update_status('cancelled', 'Автоматическое отключение оплаты: заказ не подтверждён более '.$timeout_hours.' часов');
}
}
add_action('wptasks_hourly_event', 'wptasks_auto_cancel_unpaid_orders');2. Добавляем wp_cron задачу для регулярного запуска
Чтобы функция запускалась регулярно, регистрируем задачу в wp_cron:
function wptasks_schedule_cron() {
if (!wp_next_scheduled('wptasks_hourly_event')) {
wp_schedule_event(time(), 'hourly', 'wptasks_hourly_event');
}
}
add_action('wp', 'wptasks_schedule_cron');3. Удаление задачи при деактивации плагина или темы
function wptasks_deactivate() {
$timestamp = wp_next_scheduled('wptasks_hourly_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wptasks_hourly_event');
}
}
register_deactivation_hook(__FILE__, 'wptasks_deactivate');Проверка результата после внедрения
- Создайте тестовый заказ и оставьте его в статусе «pending» или «on-hold».
- Проверьте, что прошло более 24 часов (можно вручную изменить время создания заказа в базе для теста).
- Запустите вручную cron событие:
do_action('wptasks_hourly_event');либо дождитесь автоматического запуска. - Проверьте, что статус заказа изменился на «cancelled».
- Убедитесь, что на странице оформления заказа для отменённого заказа оплата больше не доступна.
Частые ошибки и как их исправить
- Функция не запускается по расписанию: Проверьте, что wp_cron активен и нет ограничения на запуск задач на хостинге. Для теста можно вызвать функцию вручную через
do_action. - Заказы не обновляются: Убедитесь, что правильно указаны статусы заказов и дата создания заказа корректна. Для фильтрации
date_createdиспользуйте форматY-m-d H:i:s. - Статус заказа меняется, но оплата всё равно доступна: Проверьте настройки WooCommerce и кэширование сайта, возможно, нужно очистить кэш, чтобы изменения вступили в силу.
Практические советы по безопасности и производительности
- Не устанавливайте слишком короткий таймаут — это может привести к отмене заказов, которые клиент ещё собирается оплатить.
- Добавьте в уведомления клиенту сообщение о том, что заказ будет отменён, если не будет подтверждён в течение 24 часов.
- Оптимизируйте выборку заказов с помощью правильных индексов в базе данных, если на сайте много заказов.
- Для больших магазинов рассмотрите использование WP-Cron с системным cron для гарантированного запуска задач.
Сравнение вариантов реализации отключения оплаты
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Использование wp_cron и update_status | Автоматическое изменение статуса заказов через задачу cron | Простая реализация, автоматизация | Зависит от работы wp_cron, возможна задержка |
| Ручное изменение статусов | Администратор меняет статусы вручную | Полный контроль | Трудоёмко, неэффективно на больших сайтах |
| Использование сторонних плагинов | Плагины для управления заказами и статусами автоматически | Готовые решения с расширенным функционалом | Зависимость от обновлений, возможные конфликты |