Проблема: почему нужно отключать оплату при неподтвержденном заказе
В WooCommerce заказы могут оставаться в статусе "ожидание оплаты" или "в обработке" длительное время, если клиент не завершил оплату или возникли технические проблемы. Это создает риски для учета товаров и финансовой отчетности, а также может приводить к ошибкам в управлении запасами. Автоматическое отключение или отмена таких заказов помогает своевременно освобождать ресурсы и избегать конфликтов.
Диагностика: как определить неподтвержденные заказы
Для начала необходимо проверить, сколько заказов находится в статусе "ожидание оплаты" (pending) или "обработка" (processing) дольше установленного времени (например, 24 часа). Это можно сделать через SQL-запрос к базе данных или с помощью WP-CLI:
wp wc order list --status=pending --format=idsИли напрямую в базе данных, например, чтобы получить заказы старше 24 часов:
SELECT ID, post_date FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < NOW() - INTERVAL 1 DAY;Если таких заказов много — пора внедрять автоматизацию.
Пошаговое решение: автоматическое отключение оплаты для неподтвержденных заказов
1. Создаем функцию для изменения статуса заказов
Добавим в файл functions.php вашей темы или лучше в кастомный плагин следующий код, который будет менять статус заказов с wc-pending на wc-cancelled, если они старше 24 часов:
function auto_cancel_unpaid_orders() {
$args = [
'limit' => -1,
'status' => 'pending',
'date_created' => '<' . ( new WC_DateTime() )->modify( '-1 day' )->format( 'Y-m-d H:i:s' ),
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order ) {
$order->update_status( 'cancelled', 'Автоматическое отключение оплаты: заказ не был подтвержден более 24 часов.' );
}
}2. Настраиваем регулярное выполнение через WP-Cron
Добавим событие, которое будет запускать эту функцию ежедневно:
if ( ! wp_next_scheduled( 'auto_cancel_unpaid_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'auto_cancel_unpaid_orders_hook' );
}
add_action( 'auto_cancel_unpaid_orders_hook', 'auto_cancel_unpaid_orders' );3. Опционально: уведомление администратора о выполнении скрипта
Чтобы отслеживать работу скрипта, добавим отправку email:
function auto_cancel_unpaid_orders() {
$args = [
'limit' => -1,
'status' => 'pending',
'date_created' => '<' . ( new WC_DateTime() )->modify( '-1 day' )->format( 'Y-m-d H:i:s' ),
];
$orders = wc_get_orders( $args );
$count = 0;
foreach ( $orders as $order ) {
$order->update_status( 'cancelled', 'Автоматическое отключение оплаты: заказ не был подтвержден более 24 часов.' );
$count++;
}
if ( $count ) {
wp_mail( get_option( 'admin_email' ), 'Автоматическая отмена заказов WooCommerce', "Отменено заказов: $count" );
}
}Проверка результата после внедрения
Чтобы проверить, что решение работает, сделайте следующее:
- Создайте тестовый заказ и оставьте его в статусе "ожидание оплаты".
- Измените дату создания заказа в базе данных на более раннюю (например, на 2 дня назад).
- Запустите вручную cron-задачу, вызвав функцию из консоли или временно добавив вызов функции в
functions.php. - Проверьте, что статус заказа изменился на "отменен" (cancelled).
- Проверьте почту администратора на наличие уведомления.
Частые ошибки и пути их устранения
- Функция не запускается автоматически: проверьте, активирован ли wp-cron (в файле
wp-config.phpне должно бытьdefine('DISABLE_WP_CRON', true);). Если wp-cron отключен, настройте системный cron на сервере. - Заказы не меняют статус: убедитесь, что у заказов правильный статус (wc-pending), и что дата создания корректна. Проверьте права пользователя, под которым запускается скрипт.
- Письма не отправляются: проверьте настройки почты сервера и функцию
wp_mail. Можно подключить SMTP-плагин для надежной отправки.
Практические советы по безопасности и производительности
- Для больших магазинов с тысячами заказов используйте пагинацию в запросах, чтобы не перегружать память:
$args = [
'limit' => 50,
'paged' => $page_number,
'status' => 'pending',
'date_created' => '<' . ( new WC_DateTime() )->modify( '-1 day' )->format( 'Y-m-d H:i:s' ),
];- Всегда используйте child-тему или собственный плагин для добавления кода, чтобы не потерять изменения при обновлении.
- Резервное копирование базы перед изменениями — обязательный пункт.
- Для уведомлений используйте фильтры и шаблоны, чтобы письма были информативными.
Альтернативные варианты реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин автоматической отмены заказов | Быстрая установка, интерфейс | Может быть избыточным, нагрузка на сайт |
| Собственный код с WP-Cron (текущий вариант) | Легковесно, точечное решение, кастомизация | Требует навыков, настройка cron |
| Ручное управление заказами | Полный контроль | Трудозатратно, риск ошибок |