Автоматическая регистрация пользователей на сайте WordPress с подтверждением email — важный инструмент для повышения безопасности и качества базы пользователей. В этой статье мы разберем, как создать собственную функцию автoрегистрации с подтверждением email, используя нативные возможности WordPress и минимальное количество сторонних плагинов. Такой подход помогает сохранить контроль над процессом и избежать лишних зависимостей.
Почему нужна автoрегистрация с подтверждением email?
Зачастую на сайтах с открытой регистрацией появляется много спам-аккаунтов или ботов, которые снижают качество аудитории и могут создавать нагрузку на сервер. Подтверждение email — простой, но эффективный способ фильтрации таких регистраций. Пользователь получает письмо с уникальной ссылкой подтверждения, без нажатия на которую регистрация не завершается.
Автоматизация регистрации полезна, например, при интеграции с внешними сервисами, когда нужно быстро завести учетную запись без ручного вмешательства, но при этом обеспечить проверку email.
Обзор решения: как будет работать функция
Сценарий такой:
- Пользователь заполняет форму регистрации на сайте.
- Данные проверяются и создается учетная запись WordPress в статусе "ожидание" (пользователь не активен).
- На email пользователя отправляется письмо с уникальной ссылкой подтверждения.
- При переходе по ссылке аккаунт активируется и пользователь может войти.
Такой подход позволяет избежать активации фальшивых или ошибочных аккаунтов.
Создаем короткую форму регистрации
Начнем с создания простой формы регистрации. Ее можно вывести через шорткод, который мы добавим в functions.php вашей темы или в плагин.
function wpone_registration_form() {
if (is_user_logged_in()) {
return '<p>Вы уже зарегистрированы.</p>';
}
$html = '<form method="post" action="">'
. '<p><label>Email (логин)</label><br>'
. '<input type="email" name="wpone_email" required /></p>'
. '<p><label>Пароль</label><br>'
. '<input type="password" name="wpone_password" required /></p>'
. '<p><input type="submit" name="wpone_register" value="Зарегистрироваться" /></p>'
. '</form>';
return $html;
}
add_shortcode('wpone_registration', 'wpone_registration_form');Теперь на любой странице можно вставить шорткод [wpone_registration] и отобразить форму.
Обработка данных и создание пользователя с подтверждением
Добавим функцию, которая будет обрабатывать POST-запрос при отправке формы, создавать пользователя с ролью "pending", генерировать уникальный код подтверждения и отправлять email.
function wpone_handle_registration() {
if (!empty($_POST['wpone_register'])) {
$email = sanitize_email($_POST['wpone_email']);
$password = $_POST['wpone_password'];
if (!is_email($email)) {
echo '<p style="color:red;">Неверный email.</p>';
return;
}
if (username_exists($email) || email_exists($email)) {
echo '<p style="color:red;">Пользователь с таким email уже существует.</p>';
return;
}
if (strlen($password) < 6) {
echo '<p style="color:red;">Пароль должен быть не менее 6 символов.</p>';
return;
}
// Создаем пользователя с ролью pending
$user_id = wp_create_user($email, $password, $email);
if (is_wp_error($user_id)) {
echo '<p style="color:red;">Ошибка при создании пользователя.</p>';
return;
}
$user = new WP_User($user_id);
$user->set_role('pending');
// Генерируем код подтверждения
$code = wpone_generate_confirmation_code($user_id);
// Отправляем письмо
wpone_send_confirmation_email($email, $code);
echo '<p>Регистрация прошла успешно! Проверьте email для подтверждения.</p>';
exit;
}
}
add_action('init', 'wpone_handle_registration');
// Функция генерации кода
function wpone_generate_confirmation_code($user_id) {
$code = wp_generate_password(20, false, false);
update_user_meta($user_id, 'wpone_confirmation_code', $code);
update_user_meta($user_id, 'wpone_is_confirmed', 0);
return $code;
}
// Функция отправки email
function wpone_send_confirmation_email($email, $code) {
$confirm_url = add_query_arg(array(
'wpone_confirm' => '1',
'code' => $code,
'email' => urlencode($email),
), site_url());
$subject = 'Подтверждение регистрации на сайте ' . get_bloginfo('name');
$message = 'Спасибо за регистрацию! Для активации аккаунта перейдите по ссылке: ' . $confirm_url;
wp_mail($email, $subject, $message);
}Обработка подтверждения по ссылке
Теперь реализуем активацию аккаунта при переходе по ссылке из письма. Для этого используем хук init и проверим параметры в URL.
function wpone_handle_confirmation() {
if (!empty($_GET['wpone_confirm']) && $_GET['wpone_confirm'] === '1' && !empty($_GET['code']) && !empty($_GET['email'])) {
$email = sanitize_email(urldecode($_GET['email']));
$code = sanitize_text_field($_GET['code']);
$user = get_user_by('email', $email);
if (!$user) {
wp_die('Пользователь не найден.');
}
$saved_code = get_user_meta($user->ID, 'wpone_confirmation_code', true);
$is_confirmed = get_user_meta($user->ID, 'wpone_is_confirmed', true);
if ($is_confirmed) {
wp_die('Аккаунт уже подтвержден.');
}
if ($code === $saved_code) {
update_user_meta($user->ID, 'wpone_is_confirmed', 1);
$user->set_role('subscriber'); // активируем роль
delete_user_meta($user->ID, 'wpone_confirmation_code');
wp_redirect(home_url('/login?confirmed=1'));
exit;
} else {
wp_die('Неверный код подтверждения.');
}
}
}
add_action('init', 'wpone_handle_confirmation');Запрет входа для неподтвержденных пользователей
Чтобы не допускать вход в систему неподтвержденных пользователей, добавим проверку при попытке авторизации.
function wpone_prevent_login_unconfirmed($user, $username, $password) {
if (is_a($user, 'WP_User')) {
$is_confirmed = get_user_meta($user->ID, 'wpone_is_confirmed', true);
if ($user->roles[0] === 'pending' || !$is_confirmed) {
return new WP_Error('pending_account', '<strong>Ошибка:</strong> Ваш аккаунт не подтвержден. Проверьте email.');
}
}
return $user;
}
add_filter('wp_authenticate_user', 'wpone_prevent_login_unconfirmed', 10, 3);Создание роли «pending»
По умолчанию WordPress не имеет роли "pending", поэтому создадим ее при инициализации темы или плагина.
function wpone_add_pending_role() {
add_role('pending', 'Ожидает подтверждения', array(
'read' => false,
));
}
add_action('init', 'wpone_add_pending_role');Рекомендации по плагинам для подтверждения email
Если вам нужно более готовое решение с расширенной функциональностью, можно рассмотреть плагины, которые поддерживают подтверждение email и интеграцию с формами:
- My Popup — можно реализовать всплывающую форму регистрации с подтверждением.
- Expert Review — для расширенных отзывов с обязательной валидацией email.
Однако создание собственного решения дает гибкость и понимание процесса.
Итоги
В статье мы рассмотрели, как создать функцию автoрегистрации пользователей WordPress с подтверждением email. Важные моменты:
- Создали короткую форму регистрации с шорткодом.
- Обработали регистрацию, создав пользователя с ролью «pending» и отправив email с кодом.
- Реализовали активацию аккаунта по ссылке из письма.
- Запретили вход неподтвержденным пользователям.
- Создали новую роль «pending» для хранения статуса.
Такой подход поможет сделать регистрацию на вашем сайте более защищенной и удобной.