Как создать функцию автoрегистрации пользователей WordPress с подтверждением email

Автоматическая регистрация пользователей на сайте 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» для хранения статуса.

Такой подход поможет сделать регистрацию на вашем сайте более защищенной и удобной.

Как использовать WPCommunity для создания приватного клубного сайта на WordPress
19.01.2026
Автоматическое удаление спама в комментариях WordPress: практические решения
27.12.2025
Как использовать хуки в WordPress: практические примеры и советы
23.11.2025
Как использовать WP-Cron для автоматизации задач в WordPress
01.12.2025
Оптимизация кода WordPress: эффективные методы и примеры
07.11.2025