Во многих проектах на WordPress возникает необходимость создать собственную форму регистрации пользователей, например, чтобы интегрировать её в уникальный дизайн сайта или добавить кастомные поля без лишних плагинов. В этой статье подробно разберем, как реализовать простую регистрацию пользователей в WordPress с нуля, используя только стандартные функции платформы и немного PHP-кода.
Почему стоит создавать собственную форму регистрации без плагинов
Плагины для регистрации, конечно, экономят время, но часто приводят к избыточности кода и нагрузке на сайт. Кроме того, если нужно тонко кастомизировать процесс регистрации или интегрировать её с другими системами, плагин становится ограничением. Собственная разработка позволяет:
- Контролировать весь процесс регистрации и валидации данных;
- Добавлять любые поля и обрабатывать их по-своему;
- Избежать конфликтов с другими плагинами и обновлениями;
- Оптимизировать скорость и безопасность;
- Вписать форму в дизайн сайта без ограничений.
Далее рассмотрим поэтапно, как создать простую и безопасную регистрацию.
Создание формы регистрации: минимальный набор полей и структура
Для начала определимся с минимальным набором полей — обычно это имя пользователя, email и пароль. Можно добавить, например, поле для имени или ссылки на соцсети, но для базовой регистрации этих трех достаточно.
Создадим функцию wpnotes_render_registration_form(), которая выведет HTML-форму регистрации. В форме обязательно должны быть nonce-поле для безопасности и действие, чтобы знать, что форма была отправлена.
function wpnotes_render_registration_form() {
if ( is_user_logged_in() ) {
echo '<p>Вы уже зарегистрированы.</p>';
return;
}
$nonce = wp_create_nonce('wpnotes_register_nonce');
echo '<form method="post" action="">';
echo '<p><label>Имя пользователя</label><br><input type="text" name="wpnotes_user_login" required></p>';
echo '<p><label>Email</label><br><input type="email" name="wpnotes_user_email" required></p>';
echo '<p><label>Пароль</label><br><input type="password" name="wpnotes_user_pass" required></p>';
echo '<input type="hidden" name="wpnotes_register_nonce" value="' . $nonce . '">';
echo '<p><input type="submit" name="wpnotes_register_submit" value="Зарегистрироваться"></p>';
echo '</form>';
}Эту функцию можно вывести в нужном месте темы через do_action или напрямую вызвать в шаблоне.
Обработка и валидация данных регистрации
После отправки формы нужно проверить nonce, валидность введенных данных и создать пользователя. Для этого добавим функцию wpnotes_handle_registration(), которую подключим к хуку init. В ней:
- Проверим, что форма отправлена и nonce валиден;
- Проверим, что логин и email уникальны и соответствуют требованиям WordPress;
- Создадим пользователя с помощью
wp_create_user(); - Выведем ошибки или сообщение об успешной регистрации.
function wpnotes_handle_registration() {
if ( isset($_POST['wpnotes_register_submit']) ) {
if ( ! isset($_POST['wpnotes_register_nonce']) || ! wp_verify_nonce($_POST['wpnotes_register_nonce'], 'wpnotes_register_nonce') ) {
echo '<p>Ошибка безопасности. Попробуйте снова.</p>';
return;
}
$login = sanitize_user($_POST['wpnotes_user_login']);
$email = sanitize_email($_POST['wpnotes_user_email']);
$pass = $_POST['wpnotes_user_pass'];
$errors = new WP_Error();
if ( empty($login) || empty($email) || empty($pass) ) {
$errors->add('field', 'Все поля обязательны для заполнения.');
}
if ( ! validate_username($login) ) {
$errors->add('username_invalid', 'Неверный формат имени пользователя.');
}
if ( username_exists($login) ) {
$errors->add('username_exists', 'Имя пользователя уже занято.');
}
if ( ! is_email($email) ) {
$errors->add('email_invalid', 'Неверный email.');
}
if ( email_exists($email) ) {
$errors->add('email_exists', 'Email уже зарегистрирован.');
}
if ( strlen($pass) < 6 ) {
$errors->add('password_short', 'Пароль должен быть не менее 6 символов.');
}
if ( ! empty($errors->errors) ) {
foreach ( $errors->get_error_messages() as $error ) {
echo '<p style="color:red;">' . esc_html($error) . '</p>';
}
return;
}
$user_id = wp_create_user($login, $pass, $email);
if ( is_wp_error($user_id) ) {
echo '<p style="color:red;">Ошибка регистрации: ' . esc_html($user_id->get_error_message()) . '</p>';
} else {
echo '<p style="color:green;">Регистрация прошла успешно. Теперь вы можете войти.</p>';
}
}
}
add_action('init', 'wpnotes_handle_registration');Добавление дополнительных полей и сохранение их в профиле пользователя
Часто нужно добавить кастомные поля, например, телефон или дату рождения. Для этого расширим форму и добавим обработку новых полей. Например, добавим поле "Телефон":
function wpnotes_render_registration_form() {
if ( is_user_logged_in() ) {
echo '<p>Вы уже зарегистрированы.</p>';
return;
}
$nonce = wp_create_nonce('wpnotes_register_nonce');
echo '<form method="post" action="">';
echo '<p><label>Имя пользователя</label><br><input type="text" name="wpnotes_user_login" required></p>';
echo '<p><label>Email</label><br><input type="email" name="wpnotes_user_email" required></p>';
echo '<p><label>Пароль</label><br><input type="password" name="wpnotes_user_pass" required></p>';
echo '<p><label>Телефон</label><br><input type="text" name="wpnotes_user_phone" pattern="[0-9\+\-\s]+" title="Только цифры, пробелы, + и -" required></p>';
echo '<input type="hidden" name="wpnotes_register_nonce" value="' . $nonce . '">';
echo '<p><input type="submit" name="wpnotes_register_submit" value="Зарегистрироваться"></p>';
echo '</form>';
}
function wpnotes_handle_registration() {
if ( isset($_POST['wpnotes_register_submit']) ) {
if ( ! isset($_POST['wpnotes_register_nonce']) || ! wp_verify_nonce($_POST['wpnotes_register_nonce'], 'wpnotes_register_nonce') ) {
echo '<p>Ошибка безопасности. Попробуйте снова.</p>';
return;
}
$login = sanitize_user($_POST['wpnotes_user_login']);
$email = sanitize_email($_POST['wpnotes_user_email']);
$pass = $_POST['wpnotes_user_pass'];
$phone = sanitize_text_field($_POST['wpnotes_user_phone']);
$errors = new WP_Error();
if ( empty($login) || empty($email) || empty($pass) || empty($phone) ) {
$errors->add('field', 'Все поля обязательны для заполнения.');
}
if ( ! validate_username($login) ) {
$errors->add('username_invalid', 'Неверный формат имени пользователя.');
}
if ( username_exists($login) ) {
$errors->add('username_exists', 'Имя пользователя уже занято.');
}
if ( ! is_email($email) ) {
$errors->add('email_invalid', 'Неверный email.');
}
if ( email_exists($email) ) {
$errors->add('email_exists', 'Email уже зарегистрирован.');
}
if ( strlen($pass) < 6 ) {
$errors->add('password_short', 'Пароль должен быть не менее 6 символов.');
}
if ( ! preg_match('/^[0-9\+\-\s]+$/', $phone) ) {
$errors->add('phone_invalid', 'Телефон содержит недопустимые символы.');
}
if ( ! empty($errors->errors) ) {
foreach ( $errors->get_error_messages() as $error ) {
echo '<p style="color:red;">' . esc_html($error) . '</p>';
}
return;
}
$user_id = wp_create_user($login, $pass, $email);
if ( is_wp_error($user_id) ) {
echo '<p style="color:red;">Ошибка регистрации: ' . esc_html($user_id->get_error_message()) . '</p>';
} else {
update_user_meta($user_id, 'wpnotes_user_phone', $phone);
echo '<p style="color:green;">Регистрация прошла успешно. Теперь вы можете войти.</p>';
}
}
}
add_action('init', 'wpnotes_handle_registration');Чтобы вывести сохраненное значение телефона в профиле пользователя, можно использовать хуки show_user_profile и edit_user_profile. Это полезно для администраторов.
Как вывести дополнительное поле в профиле пользователя в админке
Добавим функции для отображения и сохранения поля «Телефон» в профиле:
function wpnotes_show_extra_profile_fields($user) {
$phone = get_user_meta($user->ID, 'wpnotes_user_phone', true);
echo '<h3>Дополнительные данные WPNotes</h3>';
echo '<table class="form-table"><tr><th><label for="wpnotes_user_phone">Телефон</label></th><td>';
echo '<input type="text" name="wpnotes_user_phone" id="wpnotes_user_phone" value="' . esc_attr($phone) . '" class="regular-text" />';
echo '</td></tr></table>';
}
add_action('show_user_profile', 'wpnotes_show_extra_profile_fields');
add_action('edit_user_profile', 'wpnotes_show_extra_profile_fields');
function wpnotes_save_extra_profile_fields($user_id) {
if ( ! current_user_can('edit_user', $user_id) ) {
return false;
}
if ( isset($_POST['wpnotes_user_phone']) ) {
update_user_meta($user_id, 'wpnotes_user_phone', sanitize_text_field($_POST['wpnotes_user_phone']));
}
}
add_action('personal_options_update', 'wpnotes_save_extra_profile_fields');
add_action('edit_user_profile_update', 'wpnotes_save_extra_profile_fields');Советы по безопасности и улучшениям
Регистрация — один из уязвимых участков сайта, поэтому важно соблюдать базовые меры безопасности:
- Обязательно использовать
wp_nonce_fieldи проверять nonce; - Санитизировать и валидировать все входящие данные;
- Использовать защиту от спама (captcha, honeypot, ограничение по IP);
- Ограничивать длину и формат паролей;
- Регистрация должна быть доступна только для гостей (неавторизованных);
- При необходимости добавить подтверждение email с помощью ссылки;
- Рассмотреть возможность автоматического входа после регистрации.
Также можно расширить функционал, добавив:
- Отправку уведомлений администратору;
- Подключение reCAPTCHA;
- Кастомные роли и права при регистрации;
- Логирование попыток регистрации для анализа.
Альтернативы: плагины для расширенной регистрации
Если функционала собственной формы не хватает, можно использовать проверенные плагины, например:
- WP User Manager — простой и легкий плагин с поддержкой кастомных форм и полей;
- User Registration — визуальный конструктор форм регистрации;
- Ultimate Member — мощный инструмент с расширенными профилями и членством;
- Profile Builder — гибкий и многофункциональный.
Но если вам нужна легкая и быстрая регистрация без лишних зависимостей, собственная реализация — лучший вариант.
Заключение: простой старт для вашей формы регистрации
Мы рассмотрели, как сделать базовую регистрацию пользователей в WordPress без плагинов. В статье были приведены примеры кода для формы, обработки данных, добавления дополнительного поля и отображения его в профиле. Такое решение позволяет вам полностью контролировать процесс и легко адаптировать под нужды проекта.