Регистрация пользователей — важный элемент любого сайта на WordPress, особенно если вы хотите создать сообщество или ограничить доступ к определённому контенту. По умолчанию WordPress предоставляет базовую форму регистрации и минимальный набор полей, но часто возникает необходимость её изменить: добавить новые поля, проверить ввод, отправить дополнительные уведомления или изменить поведение после регистрации.
Почему стоит использовать хуки для изменения регистрации пользователей в WordPress
Изменение стандартного поведения через хуки — это правильный и безопасный способ кастомизации. Хуки позволяют вмешиваться в процесс без изменения исходного кода ядра WordPress, что сохраняет совместимость с обновлениями и снижает риск ошибок.
Основные хуки, связанные с регистрацией пользователей:
register_form— позволяет добавить дополнительные поля в форму регистрации;registration_errors— фильтр для проверки и валидации введённых данных;user_register— действие, которое срабатывает после успешной регистрации пользователя;wp_insert_user_data— позволяет изменить данные пользователя перед их сохранением.
Добавление дополнительных полей в форму регистрации через хук register_form
Например, добавим поле «Телефон» в форму регистрации. Для этого используем хук register_form и выведем HTML-код поля.
function wppartner_register_form_phone_field() {
$phone = isset($_POST['phone']) ? esc_attr($_POST['phone']) : '';
echo '<p>'
. '<label for="phone">Телефон</label>'
. '<input type="text" name="phone" id="phone" class="input" value="' . $phone . '" size="25" />'
. '</p>';
}
add_action('register_form', 'wppartner_register_form_phone_field');Этот код добавит простое текстовое поле в форму регистрации. Значение поля сохраняется, чтобы пользователь не терял введённые данные при ошибке.
Валидация новых полей с помощью фильтра registration_errors
Важно проверять введённые данные, чтобы избежать некорректной информации. Используем фильтр registration_errors для проверки поля «Телефон».
function wppartner_registration_errors_phone_validation($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', 'wppartner_registration_errors_phone_validation', 10, 3);Здесь мы проверяем, что телефон содержит от 10 до 15 цифр с возможным плюсом в начале. Если проверка не проходит, добавляем ошибку, которую WordPress покажет пользователю.
Сохранение дополнительных полей в метаданных пользователя после регистрации
После успешной регистрации нам нужно сохранить введённый телефон в профиле пользователя. Для этого используем хук user_register.
function wppartner_save_phone_user_meta($user_id) {
if (!empty($_POST['phone'])) {
update_user_meta($user_id, 'phone', sanitize_text_field($_POST['phone']));
}
}
add_action('user_register', 'wppartner_save_phone_user_meta');Функция update_user_meta добавляет или обновляет метаданные пользователя. Благодаря этому в админке WordPress или через код можно получить номер телефона пользователя.
Отображение дополнительных полей в профиле пользователя в админке
Чтобы администраторы могли видеть и редактировать номер телефона, добавим поле в профиль пользователя.
function wppartner_show_phone_in_profile($user) {
$phone = get_user_meta($user->ID, 'phone', true);
?>
<h3>Дополнительная информация</h3>
<table class="form-table">
<tr>
<th><label for="phone">Телефон</label></th>
<td>
<input type="text" name="phone" id="phone" value="<?php echo esc_attr($phone); ?>" class="regular-text" />
</td>
</tr>
</table>
<?php
}
add_action('show_user_profile', 'wppartner_show_phone_in_profile');
add_action('edit_user_profile', 'wppartner_show_phone_in_profile');
function wppartner_save_phone_profile_field($user_id) {
if (!current_user_can('edit_user', $user_id)) {
return false;
}
if (isset($_POST['phone'])) {
update_user_meta($user_id, 'phone', sanitize_text_field($_POST['phone']));
}
}
add_action('personal_options_update', 'wppartner_save_phone_profile_field');
add_action('edit_user_profile_update', 'wppartner_save_phone_profile_field');Теперь администраторы и сами пользователи могут видеть и редактировать номер телефона в профиле.
Пример плагинов для расширения регистрации пользователей
Если не хочется писать код, можно использовать готовые решения. Вот несколько популярных плагинов, которые позволяют кастомизировать регистрацию:
- User Registration — простой конструктор форм с множеством полей и интеграциями;
- Profile Builder — позволяет создавать настраиваемые формы регистрации, редактирования профиля и многое другое;
- WP User Manager — мощный плагин для управления регистрацией, профилями и ролями.
Однако знание того, как работать с хуками, даст больше гибкости и позволит интегрировать регистрацию с вашим уникальным бизнес-процессом.
Безопасность и рекомендации при кастомизации регистрации
При добавлении новых полей и изменений в форме регистрации важно соблюдать несколько правил:
- Всегда валидируйте и фильтруйте входящие данные, чтобы избежать XSS и инъекций.
- Используйте
nonceдля защиты форм от CSRF-атак. - Не храните чувствительные данные в открытом виде, при необходимости используйте шифрование.
- Проверяйте права доступа при редактировании данных профиля.
Пример добавления nonce в форму регистрации:
function wppartner_register_form_nonce() {
wp_nonce_field('wppartner_register_action', 'wppartner_register_nonce');
}
add_action('register_form', 'wppartner_register_form_nonce');И проверка nonce в валидации:
function wppartner_registration_errors_nonce_check($errors) {
if (!isset($_POST['wppartner_register_nonce']) || !wp_verify_nonce($_POST['wppartner_register_nonce'], 'wppartner_register_action')) {
$errors->add('nonce_error', '<strong>Ошибка:</strong> Ошибка безопасности, попробуйте снова.');
}
return $errors;
}
add_filter('registration_errors', 'wppartner_registration_errors_nonce_check');