Почему стоит создавать собственную форму регистрации в 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 является стандартным и безопасным способом расширения функционала.
Приведённые в статье примеры кода помогут быстро начать работу и адаптировать форму под свои нужды. Не забывайте о безопасности и удобстве пользователей при разработке своих решений.