В современных условиях удобство авторизации на сайте выходит на первый план. Один из популярных способов — вход по номеру телефона с подтверждением через SMS. В этой статье мы пошагово разберём, как создать собственный плагин для WordPress, который реализует авторизацию пользователей по телефонному номеру с использованием SMS-кода.
Зачем нужна авторизация по телефону в WordPress
Стандартный вход через логин и пароль часто вызывает сложности у пользователей: забытые пароли, сложность регистрации и пр. Телефонный номер — это уникальный идентификатор, который пользователь всегда помнит. Такой способ повышает удобство и безопасность.
Кроме того, это снижает нагрузку на службу поддержки и сокращает количество брошенных регистраций. Для многих проектов, особенно коммерческих и социальных, это важный инструмент.
Реализация собственного плагина даёт гибкость: вы сможете интегрировать любую SMS-службу, адаптировать под дизайн и логику сайта.
Основные этапы создания плагина авторизации по телефону
Регистрация и валидация номера
Первым шагом необходимо создать форму, в которой пользователь вводит свой номер телефона. Для удобства и правильной работы с данными нужно реализовать:
- Проверку формата номера (например, через регулярные выражения);
- Очистку данных от лишних символов;
- Проверку, зарегистрирован ли такой номер в базе данных пользователей WordPress.
Вот пример функции для валидации номера с префиксом wpcodex_:
function wpcodex_validate_phone($phone) {
$phone = preg_replace('/[^\d]/', '', $phone); // оставляем только цифры
if(strlen($phone) < 10 || strlen($phone) > 15) {
return false; // некорректная длина
}
return $phone;
}Отправка SMS с кодом подтверждения
Для отправки SMS можно использовать сторонние сервисы: Twilio, SMS.ru, Nexmo и др. Важно, чтобы сервис имел удобный API и позволял отправлять сообщения программно.
Пример интеграции с SMS.ru через cURL:
function wpcodex_send_sms($phone, $code) {
$api_id = 'ВАШ_API_ID';
$message = 'Ваш код подтверждения: ' . $code;
$url = 'https://sms.ru/sms/send?api_id=' . $api_id . '&to=' . $phone . '&msg=' . urlencode($message);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}При разработке плагина сделайте настройки подключения к SMS-сервису через страницу настроек в админке WordPress.
Хранение и проверка кода
Сгенерированный код нужно сохранить в сессии или в базе (например, в пользовательском мета-поле), чтобы потом сверить при вводе пользователем.
Пример генерации 6-значного кода и сохранения в сессию:
function wpcodex_generate_code() {
return rand(100000, 999999);
}
session_start();
$_SESSION['wpcodex_phone_code'] = wpcodex_generate_code();Далее при вводе кода пользователем проверяйте совпадение с сохранённым.
Пример простой формы авторизации по телефону
Ниже пример HTML-формы и обработчика на PHP для нашего плагина:
<form method="post">
<label>Телефон:</label>
<input type="text" name="phone" required />
<button type="submit">Получить код</button>
</form>
<?php
if($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['phone'])) {
$phone = wpcodex_validate_phone($_POST['phone']);
if($phone) {
// Проверяем, есть ли пользователь с таким номером
$user_query = new WP_User_Query(array(
'meta_key' => 'phone_number',
'meta_value' => $phone
));
if(!empty($user_query->results)) {
$code = wpcodex_generate_code();
$_SESSION['wpcodex_phone_code'] = $code;
$_SESSION['wpcodex_phone'] = $phone;
wpcodex_send_sms($phone, $code);
echo 'Код отправлен на ваш телефон.';
} else {
echo 'Пользователь с таким номером не найден.';
}
} else {
echo 'Некорректный номер телефона.';
}
}
?>Авторизация пользователя после подтверждения кода
После получения кода пользователь вводит его в форму. Если код совпадает, мы авторизуем пользователя программно.
Пример проверки кода и входа пользователя:
<form method="post">
<label>Введите код из SMS:</label>
<input type="text" name="phone_code" required />
<button type="submit">Войти</button>
</form>
<?php
if($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['phone_code'])) {
session_start();
$input_code = sanitize_text_field($_POST['phone_code']);
if(isset($_SESSION['wpcodex_phone_code']) && $_SESSION['wpcodex_phone_code'] == $input_code) {
// Получаем пользователя по номеру
$phone = $_SESSION['wpcodex_phone'];
$user_query = new WP_User_Query(array(
'meta_key' => 'phone_number',
'meta_value' => $phone
));
if(!empty($user_query->results)) {
$user = $user_query->results[0];
wp_set_current_user($user->ID);
wp_set_auth_cookie($user->ID);
echo 'Вы успешно вошли!';
unset($_SESSION['wpcodex_phone_code']);
unset($_SESSION['wpcodex_phone']);
} else {
echo 'Пользователь не найден.';
}
} else {
echo 'Неверный код.';
}
}
?>Как хранить телефон пользователя в профиле WordPress
Для работы этой схемы нужно, чтобы у пользователей был сохранён номер телефона в метаполях. Добавим поле при регистрации или редактировании профиля:
function wpcodex_show_phone_field($user) {
$phone = get_user_meta($user->ID, 'phone_number', true);
echo '<h3>Телефон</h3>';
echo '<table class="form-table"><tr><th><label for="phone_number">Телефон</label></th><td>';
echo '<input type="text" name="phone_number" id="phone_number" value="' . esc_attr($phone) . '" class="regular-text" />';
echo '</td></tr></table>';
}
add_action('show_user_profile', 'wpcodex_show_phone_field');
add_action('edit_user_profile', 'wpcodex_show_phone_field');
function wpcodex_save_phone_field($user_id) {
if(!current_user_can('edit_user', $user_id)) {
return false;
}
if(isset($_POST['phone_number'])) {
update_user_meta($user_id, 'phone_number', sanitize_text_field($_POST['phone_number']));
}
}
add_action('personal_options_update', 'wpcodex_save_phone_field');
add_action('edit_user_profile_update', 'wpcodex_save_phone_field');Подводим итоги и рекомендации
Создание плагина для авторизации по телефону в WordPress — задача вполне решаемая своими силами. Такой способ авторизации улучшит UX, повысит безопасность и снизит нагрузку на службу поддержки.
Рекомендуется:
- Подключать надежные SMS-сервисы с хорошим API;
- Добавлять защиту от перебора кодов (например, лимит попыток);
- Использовать SSL на сайте для безопасности передачи данных;
- Интегрировать с существующими профилями пользователей и плагинами.
Если хотите готовое решение с удобной настройкой, обратите внимание на плагин WPGPT от WPShop — он позволяет автоматизировать многие задачи по интеграции и настройке авторизации.