wplang.ru wordpress WP Lang

WooCommerce: как добавить авторизацию через Google без плагинов

Диагностика задачи: зачем нужна авторизация через Google в WooCommerce

Стандартная авторизация WooCommerce предусматривает регистрацию через email и пароль. Многие пользователи предпочитают вход через соцсети или Google для удобства и быстрого доступа. Использование сторонних плагинов увеличивает нагрузку на сайт и может вызывать конфликты. В этой статье покажу, как добавить авторизацию через Google в WooCommerce без плагинов, используя Google API и встроенные хуки WordPress.

Подготовка: регистрация приложения в Google Cloud Console

Для начала нужно получить OAuth 2.0 Client ID для вашего сайта:

  1. Перейдите в Google Cloud Console.
  2. Создайте новый проект или выберите существующий.
  3. Перейдите в раздел Credentials (Учётные данные) и нажмите Create Credentials - OAuth client ID.
  4. Выберите тип приложения Web application.
  5. В поле Authorized redirect URIs добавьте URL, который будет обрабатывать ответ от Google, например https://вашсайт.ru/google-callback.
  6. Сохраните и запишите Client ID и Client Secret.

Разработка: добавляем кнопку входа и логику авторизации

1. Добавление кнопки входа через Google на страницу входа WooCommerce

В functions.php вашей темы или в собственном плагине добавьте код для вывода кнопки:

add_action('woocommerce_login_form', function() {
    $client_id = 'ВАШ_GOOGLE_CLIENT_ID';
    $redirect_uri = urlencode(site_url('/google-callback'));
    $scope = urlencode('email profile');
    $auth_url = "https://accounts.google.com/o/oauth2/v2/auth?client_id={$client_id}&redirect_uri={$redirect_uri}&response_type=code&scope={$scope}&access_type=online&prompt=select_account";
    echo '<a href="' . esc_url($auth_url) . '" class="button google-login-button" style="background:#4285F4;color:#fff;padding:10px 20px;border-radius:3px;text-decoration:none;display:inline-block;margin-top:10px;">Войти через Google</a>';
});

2. Создаем endpoint для обработки ответа Google

Добавьте в functions.php обработчик для пути /google-callback. Регистрация endpoint необходима:

add_action('init', function() {
    add_rewrite_rule('^google-callback/?','index.php?google_callback=1','top');
});

add_filter('query_vars', function($vars) {
    $vars[] = 'google_callback';
    return $vars;
});

add_action('template_redirect', function() {
    if(get_query_var('google_callback')) {
        process_google_login();
        exit;
    }
});

3. Функция process_google_login — обмен кода на токен и авторизация пользователя

function process_google_login() {
    if(empty($_GET['code'])) {
        wp_redirect(wp_login_url());
        exit;
    }
    $code = sanitize_text_field($_GET['code']);
    $client_id = 'ВАШ_GOOGLE_CLIENT_ID';
    $client_secret = 'ВАШ_GOOGLE_CLIENT_SECRET';
    $redirect_uri = site_url('/google-callback');

    $response = wp_remote_post('https://oauth2.googleapis.com/token', [
        'body' => [
            'code' => $code,
            'client_id' => $client_id,
            'client_secret' => $client_secret,
            'redirect_uri' => $redirect_uri,
            'grant_type' => 'authorization_code'
        ]
    ]);

    if(is_wp_error($response)) {
        wp_die('Ошибка при получении токена Google.');
    }

    $body = json_decode(wp_remote_retrieve_body($response), true);
    if(empty($body['access_token'])) {
        wp_die('Ошибка авторизации Google: нет access_token');
    }

    // Получаем данные пользователя
    $user_info_response = wp_remote_get('https://www.googleapis.com/oauth2/v1/userinfo?access_token=' . $body['access_token']);
    if(is_wp_error($user_info_response)) {
        wp_die('Ошибка при получении данных пользователя Google.');
    }

    $user_info = json_decode(wp_remote_retrieve_body($user_info_response), true);
    if(empty($user_info['email'])) {
        wp_die('Не удалось получить email пользователя.');
    }

    // Ищем пользователя по email
    $user = get_user_by('email', $user_info['email']);
    if(!$user) {
        // Создаем пользователя
        $username = sanitize_user(current(explode('@', $user_info['email'])));
        $random_password = wp_generate_password(12, false);
        $user_id = wp_create_user($username, $random_password, $user_info['email']);
        if(is_wp_error($user_id)) {
            wp_die('Ошибка создания пользователя: ' . $user_id->get_error_message());
        }
        $user = get_user_by('ID', $user_id);
    }

    // Логиним пользователя
    wp_set_current_user($user->ID);
    wp_set_auth_cookie($user->ID);

    // Редирект на страницу аккаунта
    wp_redirect(wc_get_account_endpoint_url('dashboard'));
    exit;
}

Проверка результата: как убедиться, что авторизация работает

  • Перейдите на страницу входа WooCommerce: должна отображаться кнопка "Войти через Google".
  • Нажмите кнопку и выполните вход через Google аккаунт.
  • Если пользователь с таким email есть — выполнится вход, иначе — создастся новый пользователь.
  • После успешного входа вы попадете в личный кабинет WooCommerce.
  • Проверьте в админке WordPress в разделе "Пользователи" наличие нового пользователя, если он создавался.

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

  • Ошибка 404 на /google-callback — нужно обновить правила перезаписи, перейдите в Настройки - Постоянные ссылки и нажмите "Сохранить изменения".
  • Не приходит код в GET-параметрах — проверьте, что Redirect URI в Google Cloud Console точно совпадает с site_url('/google-callback').
  • Ошибка при создании пользователя — возможно, конфликт с существующим логином. Меняйте имя пользователя, например $username = $username . rand(100,999);.
  • Не происходит вход — убедитесь, что функции wp_set_current_user и wp_set_auth_cookie вызываются до выхода из скрипта.

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

  • Используйте HTTPS на сайте, иначе OAuth авторизация не будет работать.
  • Не храните Client Secret в публичных репозиториях и не выводите его в браузере.
  • Для повышения безопасности можно дополнительно проверять IP Google и использовать state-параметр в OAuth для защиты от CSRF (не показано в простом примере).
  • Кэширование результата авторизации не нужно, так как данные динамические.

Сравнение вариантов реализации авторизации через Google

МетодПлюсыМинусыКомпромисс
Плагины (например, Nextend Social Login)Простая настройка, поддержка соцсетей, обновленияЗависимость от стороннего кода, нагрузка, возможные конфликтыИспользовать проверенные плагины, минимизировать количество
Свой код на основе Google APIКонтроль над кодом, меньше зависимостейТребует знаний OAuth, ручная поддержкаПоддерживать простой и безопасный код, использовать WP хуки
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙