wpcontrol.ru wordpress WPControl.ru

Как создать собственный вид регистрации в WordPress с применением хуков

Почему стоит создавать собственную форму регистрации в WordPress

Стандартная форма регистрации WordPress имеет базовый функционал и зачастую не удовлетворяет требованиям конкретных проектов. Например, необходимо добавить дополнительные поля, валидацию, интеграцию с внешними сервисами или изменить внешний вид формы. Создание кастомной формы регистрации позволяет гибко управлять процессом, улучшить UX и повысить безопасность.

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

Основы работы с хуками для регистрации пользователей

WordPress предоставляет несколько хуков, которые можно использовать для изменения процесса регистрации:

  • register_form — добавляет дополнительные поля в форму регистрации.
  • registration_errors — позволяет валидировать введённые данные и добавлять собственные ошибки.
  • user_register — срабатывает после успешной регистрации пользователя, здесь можно обработать дополнительные данные.

Используя эти хуки, можно расширить стандартную форму регистрации, не меняя ядро WordPress и сохраняя совместимость с обновлениями.

Добавление дополнительных полей в форму регистрации

Для начала добавим в стандартную форму регистрации поле «Телефон». Сделаем это через хук register_form:

function wpcontrol_add_phone_field() {
    $phone = ( ! empty( $_POST['phone'] ) ) ? sanitize_text_field( $_POST['phone'] ) : '';
    echo '<p><label for="phone">Телефон <span class="required">*</span></label>'
         . '<input type="text" name="phone" id="phone" class="input" value="' . esc_attr( $phone ) . '" size="25" /></p>';
}
add_action( 'register_form', 'wpcontrol_add_phone_field' );

Этот код добавит поле «Телефон» в форму регистрации. Обратите внимание, что мы предварительно очищаем данные с помощью sanitize_text_field() и выводим с помощью esc_attr() для безопасности.

Валидация дополнительных полей при регистрации

Добавленное поле нужно валидировать, чтобы пользователь не оставил его пустым или ввёл некорректные данные. Для этого используем фильтр registration_errors:

function wpcontrol_validate_phone_field( $errors, $sanitized_user_login, $user_email ) {
    if ( empty( $_POST['phone'] ) || ! preg_match( '/^\+?\d{10,15}$/', $_POST['phone'] ) ) {
        $errors->add( 'phone_error', '<strong>Ошибка</strong>: введите корректный номер телефона.' );
    }
    return $errors;
}
add_filter( 'registration_errors', 'wpcontrol_validate_phone_field', 10, 3 );

В этом примере мы проверяем, что поле заполнено и соответствует простому паттерну для телефонного номера (от 10 до 15 цифр с возможным плюсом в начале). Если проверка не пройдена, пользователю выводится ошибка и регистрация не происходит.

Сохранение дополнительных данных пользователя

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

function wpcontrol_save_phone_meta( $user_id ) {
    if ( ! empty( $_POST['phone'] ) ) {
        update_user_meta( $user_id, 'phone', sanitize_text_field( $_POST['phone'] ) );
    }
}
add_action( 'user_register', 'wpcontrol_save_phone_meta' );

Этот код сохранит телефон в отдельном поле метаданных пользователя с ключом phone. Позже это значение можно вывести в профиле пользователя или использовать для рассылок.

Вывод пользовательских данных в админке WordPress

Чтобы удобнее работать с дополнительным полем, добавим отображение телефона в списке пользователей в админке. Для этого используем фильтры и действия, связанные с таблицей пользователей:

function wpcontrol_add_phone_column( $columns ) {
    $columns['phone'] = 'Телефон';
    return $columns;
}
add_filter( 'manage_users_columns', 'wpcontrol_add_phone_column' );

function wpcontrol_show_phone_column_content( $value, $column_name, $user_id ) {
    if ( 'phone' === $column_name ) {
        return get_user_meta( $user_id, 'phone', true );
    }
    return $value;
}
add_action( 'manage_users_custom_column', 'wpcontrol_show_phone_column_content', 10, 3 );

Теперь в списке пользователей будет дополнительный столбец с телефоном, что удобно для быстрой навигации и работы с контактами.

Пример создания полностью кастомной формы регистрации

Иногда нужно создать отдельную страницу с кастомной формой регистрации, без использования стандартного шаблона WordPress. Ниже пример минимальной реализации с обработкой формы и созданием пользователя:

function wpcontrol_custom_register_form() {
    if ( 'POST' === $_SERVER['REQUEST_METHOD'] && ! empty( $_POST['wpcontrol_register_nonce'] ) && wp_verify_nonce( $_POST['wpcontrol_register_nonce'], 'wpcontrol_register_action' ) ) {
        $username = sanitize_user( $_POST['username'] ?? '' );
        $email    = sanitize_email( $_POST['email'] ?? '' );
        $phone    = sanitize_text_field( $_POST['phone'] ?? '' );
        $password = $_POST['password'] ?? '';

        $errors = new WP_Error();

        if ( empty( $username ) || username_exists( $username ) ) {
            $errors->add( 'username_error', 'Неверное или занятое имя пользователя' );
        }
        if ( ! is_email( $email ) || email_exists( $email ) ) {
            $errors->add( 'email_error', 'Неверный или занятый email' );
        }
        if ( empty( $password ) ) {
            $errors->add( 'password_error', 'Введите пароль' );
        }
        if ( empty( $phone ) || ! preg_match( '/^\+?\d{10,15}$/', $phone ) ) {
            $errors->add( 'phone_error', 'Введите корректный телефон' );
        }

        if ( empty( $errors->errors ) ) {
            $user_id = wp_create_user( $username, $password, $email );
            if ( ! is_wp_error( $user_id ) ) {
                update_user_meta( $user_id, 'phone', $phone );
                echo '<p>Регистрация прошла успешно.</p>';
                return;
            } else {
                $errors->add( 'user_creation_error', $user_id->get_error_message() );
            }
        }

        foreach ( $errors->get_error_messages() as $error ) {
            echo '<p style="color:red;">' . esc_html( $error ) . '</p>';
        }
    }
    ?>
    <form method="post">
        <p><label>Имя пользователя<input type="text" name="username" required /></label></p>
        <p><label>Email<input type="email" name="email" required /></label></p>
        <p><label>Телефон<input type="text" name="phone" required /></label></p>
        <p><label>Пароль<input type="password" name="password" required /></label></p>
        <p><input type="submit" value="Зарегистрироваться" /></p>
        <?php wp_nonce_field( 'wpcontrol_register_action', 'wpcontrol_register_nonce' ); ?>
    </form>
    <?php
}

// Используйте шорткод для вывода формы
function wpcontrol_register_shortcode() {
    ob_start();
    wpcontrol_custom_register_form();
    return ob_get_clean();
}
add_shortcode( 'wpcontrol_register', 'wpcontrol_register_shortcode' );

Вы можете добавить шорткод [wpcontrol_register] в любую страницу для отображения формы регистрации. Такой подход даёт полный контроль над валидацией, выводом ошибок и обработкой данных.

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

При создании собственных форм регистрации необходимо учитывать безопасность:

  • Используйте wp_nonce_field() и проверяйте nonce для защиты от CSRF.
  • Очистите и валидируйте все входящие данные.
  • Не выводите технические ошибки напрямую пользователю, формируйте понятные сообщения.
  • Используйте готовые функции WordPress для создания пользователей (wp_create_user, wp_insert_user).
  • При необходимости добавьте капчу или ограничение по IP для защиты от ботов.

Популярные плагины для расширения регистрации в WordPress

Если не хотите писать всё вручную, можно использовать готовые решения. Вот несколько популярных плагинов с расширенными возможностями регистрации:

  • User Registration – Custom Registration Form, Login and User Profile for WordPress — удобный конструктор форм с поддержкой дополнительных полей и интеграций.
  • Profile Builder — расширенные настройки регистрации, профилей и ролей пользователей.
  • WPForms — плагин для создания любых форм, включая регистрацию с кастомными полями.

Однако при использовании плагинов всегда проверяйте их совместимость с вашей темой и другими расширениями, а также обновляйте своевременно.

Итог

Создание собственного вида регистрации в WordPress — задача вполне выполнимая, которая позволяет гибко настроить процесс под конкретные требования. Использование хуков register_form, registration_errors и user_register является стандартным и безопасным способом расширения функционала.

Приведённые в статье примеры кода помогут быстро начать работу и адаптировать форму под свои нужды. Не забывайте о безопасности и удобстве пользователей при разработке своих решений.

×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙