wpcorp.ru wordpress WP Corp

WooCommerce: автоматическое отключение заказов по неудачному платежу

Диагностика проблемы: почему неудачные платежи остаются активными

В стандартной установке WooCommerce заказы с неудачной оплатой могут оставаться в статусе "обработка" или "в ожидании оплаты", что приводит к путанице в учёте и инвентаризации. Это особенно критично для магазинов с большим количеством заказов и ограниченным запасом товаров.

Основная проблема — отсутствие автоматического изменения статуса заказа при неудачном платеже, что требует ручного вмешательства и увеличивает риск ошибок.

Как настроить автоматическое отключение заказов по неудачному платежу

Использование хука WooCommerce для обработки статуса заказа

WooCommerce предоставляет хук woocommerce_order_status_failed, который срабатывает, когда платеж не проходит. На его основе можно автоматически менять статус заказа на "отменён" или любой другой, подходящий для вашего бизнеса.

add_action('woocommerce_order_status_failed', 'auto_cancel_order_on_failed_payment', 10, 1);
function auto_cancel_order_on_failed_payment($order_id) {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    if ($order->get_status() === 'failed') {
        // Меняем статус на 'cancelled'
        $order->update_status('cancelled', 'Заказ автоматически отменён из-за неудачного платежа');
    }
}

Принудительное отключение заказов в статусе "ожидание оплаты" спустя время

Иногда платежи не подтверждаются и остаются в статусе "pending". Для автоматического отключения таких заказов можно использовать WP-Cron и проверять заказы старше заданного времени.

add_action('wp', 'setup_pending_orders_cleanup_cron');
function setup_pending_orders_cleanup_cron() {
    if (!wp_next_scheduled('cleanup_pending_orders_hook')) {
        wp_schedule_event(time(), 'hourly', 'cleanup_pending_orders_hook');
    }
}

add_action('cleanup_pending_orders_hook', 'cleanup_old_pending_orders');
function cleanup_old_pending_orders() {
    $args = array(
        'status' => 'pending',
        'date_created' => '<' . (time() - 3600 * 24), // Заказы старше 24 часов
        'limit' => -1
    );
    $orders = wc_get_orders($args);
    foreach ($orders as $order) {
        $order->update_status('cancelled', 'Заказ отменён автоматически после 24 часов ожидания оплаты');
    }
}

Проверка результата после внедрения

  • Создайте тестовый заказ и пройдите процесс оплаты с неудачной транзакцией (например, в режиме тестирования платежного шлюза).
  • Убедитесь, что статус заказа меняется на "отменён" автоматически без вашего вмешательства.
  • Для проверки автоматической очистки заказов в статусе "pending" создайте заказ и оставьте его неоплаченным более 24 часов, затем проверьте статус после срабатывания WP-Cron.

Частые ошибки и способы их исправления

  • Заказы не меняют статус автоматически: проверьте, подключён ли ваш код в functions.php или в плагине, и что нет конфликтов с другими плагинами, которые могут переопределять статусы.
  • WP-Cron не срабатывает: по умолчанию WP-Cron запускается при посещении сайта. На слабых или малопосещаемых сайтах WP-Cron может не срабатывать своевременно. В этом случае настройте системный cron на сервере для вызова wp-cron.php.
  • Статус заказа меняется, но инвентарь не восстанавливается: убедитесь, что для отменённых заказов включена опция возврата товаров на склад. При необходимости добавьте обработчик для восстановления запасов.

Практические советы по безопасности и производительности

  • Не используйте слишком частые интервалы WP-Cron для проверки заказов, чтобы не создавать нагрузку на базу данных. Оптимально — раз в час или раз в день в зависимости от объёма заказов.
  • Логируйте действия автоматического изменения статусов для дальнейшего аудита и отладки.
  • Ограничьте права доступа к коду, добавляющему автоматизацию, чтобы избежать случайных или злонамеренных изменений.

Сравнение вариантов реализации автоматического отключения заказов

МетодОписаниеПлюсыМинусы
Хук woocommerce_order_status_failedАвтоматическое изменение статуса при неудачном платежеМгновенное срабатывание, простая реализацияНе охватывает заказы в "pending"
WP-Cron для "pending" заказовПериодическая проверка и отмена старых неоплаченных заказовПокрывает заказы, где платеж не был инициирован или завершёнЗависит от корректной работы WP-Cron, задержки
Плагин автоматизации заказовГотовые решения для управления статусами заказовПростота в использовании, поддержкаДополнительные расходы, возможные конфликты
×
WPRemark
Внимание Внимание Внимание Внимание
-15%

на WPRemark плагин WordPress

Прокачай свой сайт! ⋙