В стандартной форме регистрации WordPress доступны только базовые поля — имя пользователя, email и пароль. Но часто возникает необходимость собирать дополнительную информацию о пользователях, например, телефон, дату рождения или согласие на рассылку. В этой статье подробно рассмотрим, как добавить дополнительные поля в форму регистрации WordPress, а также как обработать и сохранить эти данные.
Почему важно добавлять дополнительные поля в регистрацию WordPress
Дополнительные поля позволяют вам получать более точную и полезную информацию о новых пользователях сайта. Это важно для:
- Персонализации контента и предложений.
- Маркетинга и сегментации аудитории.
- Улучшения управления пользователями и модерации.
Однако просто добавить поля недостаточно — нужно корректно обработать данные и обеспечить безопасность.
Добавление дополнительных полей в форму регистрации WordPress
Для добавления новых полей в стандартную форму регистрации используем хук register_form. Он позволяет вывести свои поля перед кнопкой отправки.
Пример кода, добавляющего поле «Телефон» и чекбокс согласия на обработку данных:
function wppuzzle_add_custom_registration_fields() {
?>
<p>
<label for="phone">Телефон<br />
<input type="text" name="phone" id="phone" class="input" value="<?php if ( ! empty( $_POST['phone'] ) ) echo esc_attr( $_POST['phone'] ); ?>" size="25" /></label>
</p>
<p>
<label><input type="checkbox" name="agreement" value="1" <?php checked( ! empty( $_POST['agreement'] ) ); ?> /> Я согласен на обработку персональных данных</label>
</p>
<?php
}
add_action( 'register_form', 'wppuzzle_add_custom_registration_fields' );В этом коде мы добавили два поля, при этом сохраняем введённые значения после ошибки, чтобы пользователь не вводил заново.
Валидация дополнительных полей
Чтобы не допустить пустых или некорректных данных, нужно валидировать введённые значения. Для этого используем хук registration_errors. В примере проверим, что телефон не пустой и чекбокс отмечен:
function wppuzzle_validate_custom_registration_fields( $errors, $sanitized_user_login, $user_email ) {
if ( empty( $_POST['phone'] ) || ! preg_match( '/^\+?[0-9\s\-]+$/', $_POST['phone'] ) ) {
$errors->add( 'phone_error', '<strong>Ошибка</strong>: Пожалуйста, введите корректный номер телефона.' );
}
if ( empty( $_POST['agreement'] ) ) {
$errors->add( 'agreement_error', '<strong>Ошибка</strong>: Вы должны согласиться на обработку персональных данных.' );
}
return $errors;
}
add_filter( 'registration_errors', 'wppuzzle_validate_custom_registration_fields', 10, 3 );Регулярное выражение позволяет принимать номера с цифрами, пробелами, дефисами и знаком плюс в начале.
Сохранение дополнительных полей в метаданные пользователя
После успешной регистрации нужно сохранить данные, иначе они пропадут. Для этого используем хук user_register:
function wppuzzle_save_custom_registration_fields( $user_id ) {
if ( ! empty( $_POST['phone'] ) ) {
update_user_meta( $user_id, 'phone', sanitize_text_field( $_POST['phone'] ) );
}
if ( ! empty( $_POST['agreement'] ) ) {
update_user_meta( $user_id, 'agreement', 1 );
}
}
add_action( 'user_register', 'wppuzzle_save_custom_registration_fields' );Здесь мы используем sanitize_text_field для очистки номера телефона перед сохранением.
Как вывести дополнительные поля в профиле пользователя
Чтобы администраторы или сами пользователи могли видеть или редактировать новые поля, добавим их в профиль через хуки show_user_profile и edit_user_profile:
function wppuzzle_show_extra_profile_fields( $user ) {
?>
<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( get_user_meta( $user->ID, 'phone', true ) ); ?>" class="regular-text" /><br />
<span class="description">Введите ваш номер телефона.</span>
</td>
</tr>
<tr>
<th><label for="agreement">Согласие на обработку данных</label></th>
<td>
<input type="checkbox" name="agreement" id="agreement" value="1" <?php checked( get_user_meta( $user->ID, 'agreement', true ), 1 ); ?> />
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'wppuzzle_show_extra_profile_fields' );
add_action( 'edit_user_profile', 'wppuzzle_show_extra_profile_fields' );И не забудьте сохранить изменения:
function wppuzzle_save_extra_profile_fields( $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'] ) );
}
$agreement_value = ! empty( $_POST['agreement'] ) ? 1 : 0;
update_user_meta( $user_id, 'agreement', $agreement_value );
}
add_action( 'personal_options_update', 'wppuzzle_save_extra_profile_fields' );
add_action( 'edit_user_profile_update', 'wppuzzle_save_extra_profile_fields' );Использование плагинов для добавления дополнительных полей
Если вы не хотите писать код, существуют готовые решения. Вот несколько популярных плагинов:
- User Registration – Custom Registration Form, Login and User Profile for WordPress: удобный конструктор форм с поддержкой любых полей.
- Profile Builder: позволяет легко создавать собственные поля и управлять ими.
- Advanced Custom Fields (ACF): мощный плагин для добавления пользовательских полей, включая регистрацию.
Плагины позволяют быстро настроить нужные поля, но если нужны точные кастомизации и контроль, лучше реализовать через код.
Советы по безопасности и UX
Важно валидировать и очищать все данные, чтобы избежать уязвимостей. Также подумайте о удобстве пользователей — используйте подсказки, маски ввода и сохранение введённых данных при ошибках.
При необходимости интегрируйте дополнительные поля с email-рассылками или CRM через API.
Итоги: что мы сделали
В этой статье вы узнали, как добавить дополнительные поля в форму регистрации WordPress, как правильно их валидировать, сохранять и отображать в профиле пользователя. Мы рассмотрели пример с телефоном и согласием на обработку данных, а также перечислили полезные плагины для упрощения задачи.
Этот подход позволит вам гибко расширять функционал регистрации и собирать необходимые данные для развития вашего сайта и бизнеса.