В стандартной форме регистрации WordPress нет поля для ввода номера телефона, а иногда важно собирать этот контакт для дальнейшей коммуникации с пользователем. В этой статье мы подробно рассмотрим, как добавить кастомное поле телефона в форму регистрации, а также реализовать подтверждение номера через SMS или email. Такой функционал повысит качество базы данных и позволит снизить количество фейковых регистраций.
Добавление кастомного поля телефона в форму регистрации WordPress
Для начала добавим поле телефона непосредственно в форму регистрации. Для этого воспользуемся хуком register_form, который позволяет вывести дополнительный HTML-код перед кнопкой регистрации.
function wpbloger_add_phone_field() {
$phone = isset($_POST['wpbloger_phone']) ? sanitize_text_field($_POST['wpbloger_phone']) : '';
?>
<p>
<label for="wpbloger_phone">Номер телефона<br />
<input type="text" name="wpbloger_phone" id="wpbloger_phone" class="input" value="<?php echo esc_attr($phone); ?>" size="25" /></label>
</p>
<?php
}
add_action('register_form', 'wpbloger_add_phone_field');
Теперь поле отображается на странице регистрации. Но этого недостаточно — нужно проверить корректность введенного телефона и сохранить его.
Валидация и сохранение номера телефона при регистрации
Чтобы убедиться, что пользователь ввел номер телефона, и он соответствует нужному формату, используем хук registration_errors. Также с помощью user_register сохраним номер в метаданные пользователя.
function wpbloger_validate_phone($errors, $sanitized_user_login, $user_email) {
if (empty($_POST['wpbloger_phone']) || !preg_match('/^\+?\d{10,15}$/', $_POST['wpbloger_phone'])) {
$errors->add('phone_error', '<strong>Ошибка</strong>: Введите корректный номер телефона в международном формате.');
}
return $errors;
}
add_filter('registration_errors', 'wpbloger_validate_phone', 10, 3);
function wpbloger_save_phone_meta($user_id) {
if (!empty($_POST['wpbloger_phone'])) {
update_user_meta($user_id, 'phone_number', sanitize_text_field($_POST['wpbloger_phone']));
}
}
add_action('user_register', 'wpbloger_save_phone_meta');
Регулярное выражение /^\+?\d{10,15}$/ проверяет, что номер начинается с плюса (опционально) и содержит от 10 до 15 цифр, что подходит для большинства международных форматов.
Реализация подтверждения номера телефона
Самый надежный способ — отправить пользователю SMS с кодом подтверждения. Для этого можно использовать сервисы типа Twilio, SMS.ru или другие API. Рассмотрим общий пример с Twilio.
Регистрация и установка SDK Twilio
1. Зарегистрируйтесь на Twilio и получите SID аккаунта, Auth Token и номер телефона.
2. Установите Composer и библиотеку Twilio в корень вашего сайта (если это возможно):
composer require twilio/sdk
Отправка SMS с кодом подтверждения
Добавим генерацию кода и отправку SMS при регистрации. Чтобы сохранить код и проверить его позже, воспользуемся сессиями или user_meta с пометкой, что пользователь еще не активировал номер.
use Twilio\Rest\Client;
function wpbloger_send_sms_confirmation($user_id) {
if (!class_exists('Twilio\Rest\Client')) {
return;
}
$phone = get_user_meta($user_id, 'phone_number', true);
if (empty($phone)) {
return;
}
$sid = 'TWILIO_ACCOUNT_SID';
$token = 'TWILIO_AUTH_TOKEN';
$twilio = new Client($sid, $token);
$code = rand(100000, 999999); // 6-значный код
update_user_meta($user_id, 'phone_confirmation_code', $code);
update_user_meta($user_id, 'phone_confirmed', 0);
try {
$message = $twilio->messages->create(
$phone,
[
'from' => 'TWILIO_PHONE_NUMBER',
'body' => "Ваш код подтверждения: $code"
]
);
} catch (Exception $e) {
// Обработка ошибок отправки
}
}
add_action('user_register', 'wpbloger_send_sms_confirmation');
Не забудьте заменить TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN и TWILIO_PHONE_NUMBER на реальные значения из вашего аккаунта Twilio.
Создание формы подтверждения кода
После регистрации нужно предоставить пользователю страницу, где он введет полученный код. Для этого создадим шорткод и соответствующую обработку.
function wpbloger_phone_confirmation_form() {
if (!is_user_logged_in()) {
return 'Пожалуйста, войдите в аккаунт для подтверждения телефона.';
}
$user_id = get_current_user_id();
$message = '';
if (isset($_POST['wpbloger_confirmation_code'])) {
$input_code = sanitize_text_field($_POST['wpbloger_confirmation_code']);
$saved_code = get_user_meta($user_id, 'phone_confirmation_code', true);
if ($input_code === $saved_code) {
update_user_meta($user_id, 'phone_confirmed', 1);
delete_user_meta($user_id, 'phone_confirmation_code');
$message = 'Телефон успешно подтвержден!';
} else {
$message = 'Неверный код подтверждения.';
}
}
ob_start();
if ($message) {
echo '<p>' . esc_html($message) . '</p>';
}
if (get_user_meta($user_id, 'phone_confirmed', true) != 1) {
?>
<form method="post">
<p>
<label for="wpbloger_confirmation_code">Введите код подтверждения:</label><br />
<input type="text" name="wpbloger_confirmation_code" id="wpbloger_confirmation_code" required />
</p>
<p><input type="submit" value="Подтвердить" /></p>
</form>
<?php
} else {
echo '<p>Ваш номер телефона подтвержден.</p>';
}
return ob_get_clean();
}
add_shortcode('wpbloger_phone_confirmation', 'wpbloger_phone_confirmation_form');
Добавьте шорткод [wpbloger_phone_confirmation] на отдельную страницу «Подтверждение телефона» для удобства пользователей.
Альтернативные подходы и полезные плагины
Если вы не хотите писать весь функционал самостоятельно, можно использовать готовые плагины, например:
- Clearfy Pro — для оптимизации и добавления функционала в форму регистрации.
- WPGPT — для автоматизации ответов поддержки, которые могут помочь при подтверждении.
Для отправки SMS можно применять и другие сервисы с API, но Twilio — один из самых универсальных и удобных для разработчиков.
Контроль доступа по подтвержденному телефону
Чтобы ограничить доступ к определённому контенту или функционалу для пользователей с неподтверждённым номером, используйте проверку мета-поля phone_confirmed. Например, в шаблонах или функциях проверяйте:
if (get_user_meta(get_current_user_id(), 'phone_confirmed', true) != 1) {
echo 'Пожалуйста, подтвердите номер телефона для доступа к этому разделу.';
return;
}
Это позволит гибко управлять поведением сайта в зависимости от статуса подтверждения.
Итоги и рекомендации
Добавление поля телефона с подтверждением в WordPress — задача не самая простая, но вполне реализуемая с помощью хуков, пользовательских метаданных и внешних API. Такой подход значительно повышает качество пользователей и безопасность сайта.
Обязательно тестируйте работу кода на тестовом сайте и внимательно следите за безопасностью: не храните коды подтверждения в открытом виде, используйте HTTPS и проверяйте все входные данные.