WordPress авторизация по телефону без плагинов: практическое руководство

В современном мире удобство и безопасность авторизации пользователей становятся приоритетом для многих сайтов на WordPress. Одним из востребованных способов является авторизация по номеру телефона, которая облегчает процесс входа для пользователей и увеличивает конверсию. В этой статье мы подробно рассмотрим, как реализовать авторизацию по телефону без использования готовых плагинов, а также разберём примеры кода и интеграцию с SMS-сервисами.

Почему стоит реализовать авторизацию по телефону?

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

Преимущества:

  • Быстрая регистрация и вход без пароля.
  • Уменьшение числа забытых паролей и запросов на восстановление.
  • Дополнительный уровень защиты через SMS-коды.
  • Улучшение пользовательского опыта.

Общая архитектура решения

Для реализации авторизации по телефону нам потребуется:

  • Форма ввода номера телефона.
  • Отправка одноразового кода (OTP) на указанный номер через SMS.
  • Форма ввода полученного кода.
  • Проверка правильности кода и вход пользователя в систему.
  • Создание или поиск пользователя по номеру телефона в базе WordPress.

Для отправки SMS можно использовать API популярных сервисов, например, Twilio, SMSC или другие локальные провайдеры.

Создаем таблицу для хранения кодов авторизации

Для безопасности лучше хранить временные коды в отдельной таблице базы данных. Пример создания таблицы при активации темы или плагина:

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

    $sql = "CREATE TABLE IF NOT EXISTS $table_name (  
      id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
      phone VARCHAR(20) NOT NULL,
      otp_code VARCHAR(10) NOT NULL,
      expires_at DATETIME NOT NULL,
      PRIMARY KEY  (id),
      UNIQUE KEY phone (phone)
    ) $charset_collate;";

    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
}
register_activation_hook( __FILE__, 'wpmart_create_otp_table' );

Форма ввода номера телефона и отправка OTP

Создаем простой шорткод для отображения формы, а также обработчик отправки:

function wpmart_phone_login_form() {
    if ( is_user_logged_in() ) {
        return '<p>Вы уже авторизованы.</p>';
    }

    ob_start();
    if ( isset($_POST['wpmart_phone']) ) {
        wpmart_handle_send_otp();
    }
    ?>
    <form method="post">
        <label for="wpmart_phone">Введите номер телефона:</label><br>
        <input type="text" name="wpmart_phone" id="wpmart_phone" required pattern="\+?\d{10,15}" placeholder="+79991234567"><br>
        <input type="submit" value="Получить код">
    </form>
    <?php
    return ob_get_clean();
}
add_shortcode('wpmart_phone_login', 'wpmart_phone_login_form');

function wpmart_handle_send_otp() {
    if ( !isset($_POST['wpmart_phone']) ) return;

    $phone = sanitize_text_field($_POST['wpmart_phone']);
    // Генерация OTP
    $otp = rand(100000, 999999);
    $expires = date('Y-m-d H:i:s', time() + 300); // код действителен 5 минут

    global $wpdb;
    $table = $wpdb->prefix . 'wpmart_otp_codes';

    // Вставляем или обновляем код
    $wpdb->replace(
        $table,
        [
            'phone' => $phone,
            'otp_code' => $otp,
            'expires_at' => $expires
        ],
        [ '%s', '%s', '%s' ]
    );

    // Отправка SMS
    if ( wpmart_send_sms($phone, "Ваш код для входа: $otp") ) {
        echo '<p>Код отправлен на номер ' . esc_html($phone) . '</p>';
        wpmart_show_otp_form($phone);
    } else {
        echo '<p style="color:red;">Ошибка отправки SMS. Попробуйте позже.</p>';
    }
}

function wpmart_send_sms($phone, $message) {
    // Здесь интеграция с SMS API
    // Пример для Twilio или другого сервиса
    // Возвращаем true при успешной отправке
    return true;
}

function wpmart_show_otp_form($phone) {
    ?>
    <form method="post">
        <input type="hidden" name="wpmart_phone" value="<?php echo esc_attr($phone); ?>">
        <label for="wpmart_otp">Введите код из SMS:</label><br>
        <input type="text" name="wpmart_otp" id="wpmart_otp" required pattern="\d{6}"><br>
        <input type="submit" value="Войти">
    </form>
    <?php
}

Обработка введённого кода и вход пользователя

После того, как пользователь вводит OTP, нужно проверить его и выполнить вход или регистрацию:

function wpmart_handle_otp_login() {
    if ( !isset($_POST['wpmart_phone'], $_POST['wpmart_otp']) ) {
        return;
    }

    $phone = sanitize_text_field($_POST['wpmart_phone']);
    $otp = sanitize_text_field($_POST['wpmart_otp']);

    global $wpdb;
    $table = $wpdb->prefix . 'wpmart_otp_codes';

    $record = $wpdb->get_row($wpdb->prepare(
        "SELECT * FROM $table WHERE phone = %s",
        $phone
    ));

    if ( !$record ) {
        echo '<p style="color:red;">Код не найден. Пожалуйста, запросите новый код.</p>';
        return;
    }

    if ( $record->otp_code !== $otp ) {
        echo '<p style="color:red;">Неверный код.</p>';
        return;
    }

    if ( strtotime($record->expires_at) < time() ) {
        echo '<p style="color:red;">Срок действия кода истёк.</p>';
        return;
    }

    // Ищем пользователя по мета-данным с номером телефона
    $user_query = new WP_User_Query(array(
        'meta_key' => 'wpmart_phone',
        'meta_value' => $phone,
        'number' => 1
    ));

    if ( !empty($user_query->results) ) {
        $user = $user_query->results[0];
    } else {
        // Регистрация нового пользователя
        $username = 'user_' . substr(md5($phone), 0, 8);
        $password = wp_generate_password(12, false);
        $user_id = wp_create_user($username, $password);
        if ( is_wp_error($user_id) ) {
            echo '<p style="color:red;">Ошибка при создании пользователя.</p>';
            return;
        }
        update_user_meta($user_id, 'wpmart_phone', $phone);
        $user = get_user_by('id', $user_id);
    }

    // Вход пользователя
    wp_clear_auth_cookie();
    wp_set_current_user($user->ID);
    wp_set_auth_cookie($user->ID);

    // Удаляем код из базы
    $wpdb->delete($table, ['phone' => $phone], ['%s']);

    echo '<p>Вы успешно вошли на сайт.</p>';
}
add_action('init', 'wpmart_handle_otp_login');

Рекомендации по безопасности

При реализации авторизации по телефону стоит соблюдать ряд важных правил:

  • Используйте HTTPS для защиты данных при передаче.
  • Ограничивайте количество запросов для одного номера, чтобы избежать перебора.
  • Храните OTP в базе с ограниченным временем жизни.
  • Логируйте попытки авторизации для анализа подозрительной активности.
  • Используйте проверенные SMS-провайдеры с хорошей репутацией.

Использование плагинов и интеграция с WPGPT и Clearfy Pro

Если вы хотите расширить функциональность или автоматизировать некоторые процессы, рассмотрите использование плагинов, например, WPGPT для генерации текстов и подсказок, или Clearfy Pro для оптимизации и безопасности сайта. Они помогут сделать процесс авторизации ещё более стабильным и удобным.

WooCommerce: автоматическое создание купонов после успешной покупки
11.05.2026
Как установить ограничение на количество регистраций в WordPress
27.03.2026
WooCommerce: установка лимита на количество товаров в корзине без плагинов
05.05.2026
Как автоматизировать удаление спам-комментариев в WordPress
22.02.2026
WooCommerce: как автоматически удалять старые заказы по расписанию без плагинов
16.06.2026