WooCommerce: автоматическое отключение платежных систем при ошибках во время оформления заказа

Диагностика проблемы с платежными системами в WooCommerce

В процессе оформления заказа в WooCommerce могут возникать ошибки, связанные с платежными системами: сбои API, неправильные настройки, отсутствие ответа от платежного шлюза. Если такие ошибки не обрабатываются, пользователь застревает на этапе оплаты, а администратор не получает уведомлений. Автоматическое отключение проблемных платежных методов снижает количество неудачных попыток и улучшает UX.

Как выявить проблемные платежные системы

  • Включите журнал ошибок WooCommerce для платежных шлюзов: в WooCommerce > Статус > Логи выберите логи, связанные с платежами.
  • Проанализируйте сообщения об ошибках, например, timeout, 500 ошибка или неверный ответ API.
  • Проверьте, не появляются ли жалобы пользователей на невозможность завершить заказ.

Пошаговое решение: автоматическое отключение платежных методов при ошибках

Реализуем логику, которая при фиксировании ошибки определённого платежного шлюза сохраняет в базе статус отключения и исключает этот метод из доступных для выбора клиентов.

1. Создаём таблицу для хранения статуса платежных методов

function wpzen_create_payment_status_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'payment_gateway_status';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        gateway_id VARCHAR(100) PRIMARY KEY,
        is_disabled TINYINT(1) NOT NULL DEFAULT 0,
        disabled_at DATETIME DEFAULT CURRENT_TIMESTAMP
    ) $charset_collate;";

    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
}
add_action('init', 'wpzen_create_payment_status_table');

2. Функция для отключения платежного метода

function wpzen_disable_gateway( $gateway_id ) {
    global $wpdb;
    $table = $wpdb->prefix . 'payment_gateway_status';

    $exists = $wpdb->get_var( $wpdb->prepare("SELECT gateway_id FROM $table WHERE gateway_id = %s", $gateway_id) );
    if ( $exists ) {
        $wpdb->update( $table, [ 'is_disabled' => 1, 'disabled_at' => current_time('mysql') ], [ 'gateway_id' => $gateway_id ] );
    } else {
        $wpdb->insert( $table, [ 'gateway_id' => $gateway_id, 'is_disabled' => 1, 'disabled_at' => current_time('mysql') ] );
    }
}

3. Исключаем отключённые платежные методы из списка доступных

add_filter( 'woocommerce_available_payment_gateways', 'wpzen_filter_disabled_gateways' );
function wpzen_filter_disabled_gateways( $available_gateways ) {
    global $wpdb;
    $table = $wpdb->prefix . 'payment_gateway_status';

    $disabled = $wpdb->get_col( "SELECT gateway_id FROM $table WHERE is_disabled = 1" );

    foreach ( $disabled as $gateway_id ) {
        if ( isset( $available_gateways[ $gateway_id ] ) ) {
            unset( $available_gateways[ $gateway_id ] );
        }
    }
    return $available_gateways;
}

4. Логирование ошибок и вызов отключения

В большинстве платёжных плагинов есть хуки или методы для обработки результата оплаты. Например, для стандартного WooCommerce Payment Gateway можно обрабатывать ошибки в функции process_payment. Если вы используете сторонний плагин, ищите аналогичные хуки или фильтры.

function wpzen_check_payment_error_and_disable( $order_id, $gateway_id, $error_message ) {
    // Логируем ошибку
    if ( defined('WP_DEBUG') && WP_DEBUG ) {
        error_log( "Payment gateway error: $gateway_id, Order: $order_id, Error: $error_message" );
    }
    // Отключаем шлюз
    wpzen_disable_gateway( $gateway_id );
}

// Пример вызова, заменить на реальный хук вашего платежного плагина
add_action( 'woocommerce_payment_failed', function( $order_id, $error_message ) {
    $order = wc_get_order( $order_id );
    if ( ! $order ) return;
    $gateway_id = $order->get_payment_method();
    wpzen_check_payment_error_and_disable( $order_id, $gateway_id, $error_message );
}, 10, 2 );

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

Для проверки:

  1. Имитируйте ошибку в платёжном шлюзе (например, некорректные API-ключи или отключите интернет).
  2. Попытайтесь оформить заказ с использованием этой системы оплаты.
  3. Проверьте логи ошибок в wp-content/debug.log (если включён WP_DEBUG).
  4. Зайдите в админку, откройте страницу оформления заказа — метод должен отсутствовать в списке доступных.
  5. Проверьте таблицу wp_payment_gateway_status — у отключённого метода должен быть статус is_disabled = 1.

Частые ошибки и как их исправить

  • Таблица не создаётся: Проверьте, что функция dbDelta вызывается после подключения файла wp-admin/includes/upgrade.php.
  • Платёжный метод не отключается: Убедитесь, что ID метода совпадает с ключом в массиве $available_gateways. Используйте error_log(print_r($available_gateways, true)); для отладки.
  • Ошибка в логике отключения: Проверьте, что вызов wpzen_disable_gateway происходит только при реальной ошибке оплаты, иначе метод будет отключаться без причины.
  • Метод остаётся в списке после отключения: Проверьте, не кэшируется ли результат фильтра woocommerce_available_payment_gateways. Очистите кэш сайта и браузера.

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

  • Всегда валидируйте данные, получаемые из платежных систем, чтобы избежать подделки статусов.
  • Добавьте возможность включать отключённые методы вручную через админку или WP CLI для восстановления работы.
  • Логируйте ошибки только в режиме отладки, чтобы не загромождать логи в продакшене.
  • Для производительности используйте транзиенты, если количество платежных методов большое, чтобы не делать каждый раз запрос к базе.

Сравнение способов отключения платежных методов

МетодПлюсыМинусы
Отключение через базу и фильтр woocommerce_available_payment_gatewaysГибко, работает с любыми шлюзами, сохраняет статусНужно самостоятельно обрабатывать ошибки, есть накладные расходы при запросах к БД
Отключение через настройки плагина платежной системыПростое решение, не требует кодаНельзя автоматизировать при ошибках, требует ручного вмешательства
Использование сторонних плагинов мониторинга платежейАвтоматизация, расширенные функцииДополнительная нагрузка и зависимость от сторонних решений
WooCommerce: автоматическое отключение платежных систем при ошибках во время оформления заказа
07.07.2026
Оптимизация базы данных WordPress: как ускорить сайт и уменьшить нагрузку
07.11.2025
Автоматическое удаление старого контента в WordPress
19.03.2026
Отладка проблем с AJAX в WooCommerce на примере обработки заказов
28.01.2026
Как удалить пустые таблицы базы данных в WordPress
05.03.2026