В стандартной форме регистрации WordPress присутствует ограниченный набор полей: имя пользователя, email и пароль. Однако часто возникает необходимость собрать дополнительную информацию от пользователей, например, телефон, дату рождения или согласие с правилами сайта. В этой статье подробно разберём, как добавить дополнительные поля в форму регистрации WordPress, обработать их и сохранить в базе данных, а также как вывести эти данные в профиле пользователя.
Почему важно добавлять дополнительные поля в форму регистрации WordPress
Бизнес-требования, маркетинг или особенности проекта часто требуют расширения стандартной формы регистрации. Дополнительные поля позволяют собрать нужную информацию на этапе регистрации, что облегчает дальнейшую работу с пользователями. Например, вы можете спросить регион проживания для геолокации, согласие на рассылку или дополнительные контакты.
Добавлять такие поля можно как с помощью плагинов, так и собственноручно через хук register_form. Мы рассмотрим второй способ, чтобы вы лучше понимали, как происходит интеграция.
Добавление дополнительных полей в форму регистрации через хук register_form
Хук register_form позволяет добавить HTML элементы в форму регистрации. Например, добавим поле «Телефон».
function wptests_add_phone_field() {
$phone = ( isset( $_POST['wptests_phone'] ) ) ? sanitize_text_field( $_POST['wptests_phone'] ) : '';
echo '<p>';
echo '<label for="wptests_phone">Телефон</label><br/>';
echo '<input type="text" name="wptests_phone" id="wptests_phone" class="input" value="' . esc_attr( $phone ) . '" size="25" />';
echo '</p>';
}
add_action( 'register_form', 'wptests_add_phone_field' );
После добавления этого кода в файл functions.php активной темы при регистрации появится новое поле «Телефон».
Валидация введённых данных дополнительных полей
Чтобы проверить правильность введённых данных и не допустить пустых или некорректных значений, необходимо использовать хук registration_errors. В нашем примере проверим, что поле "Телефон" заполнено и содержит только цифры, пробелы и знаки +, -, ().
function wptests_validate_phone_field( $errors, $sanitized_user_login, $user_email ) {
if ( empty( $_POST['wptests_phone'] ) ) {
$errors->add( 'wptests_phone_error', '<strong>Ошибка</strong>: Пожалуйста, введите телефон.' );
} else {
$phone = sanitize_text_field( $_POST['wptests_phone'] );
if ( ! preg_match( '/^[0-9\s\+\-\(\)]+$/', $phone ) ) {
$errors->add( 'wptests_phone_error', '<strong>Ошибка</strong>: Телефон содержит недопустимые символы.' );
}
}
return $errors;
}
add_filter( 'registration_errors', 'wptests_validate_phone_field', 10, 3 );
Таким образом, если пользователь не заполнит поле или введёт недопустимые символы, регистрация не пройдет, и ему будет показано сообщение об ошибке.
Сохранение дополнительных полей в базе данных пользователя
После успешной регистрации нужно сохранить значение дополнительного поля. Для этого используем хук user_register. Сохраним телефон в мета данных пользователя.
function wptests_save_phone_field( $user_id ) {
if ( ! empty( $_POST['wptests_phone'] ) ) {
update_user_meta( $user_id, 'wptests_phone', sanitize_text_field( $_POST['wptests_phone'] ) );
}
}
add_action( 'user_register', 'wptests_save_phone_field' );
Теперь поле "Телефон" будет храниться в базе и доступно при необходимости.
Отображение дополнительных полей в профиле пользователя
Чтобы администраторы или сами пользователи могли видеть и редактировать дополнительное поле в админке, нужно добавить его в профиль. Для этого используем хуки show_user_profile и edit_user_profile для вывода, а personal_options_update и edit_user_profile_update для сохранения изменений.
function wptests_show_phone_field( $user ) {
$phone = get_user_meta( $user->ID, 'wptests_phone', true );
?>
<h3>Дополнительные данные</h3>
<table class="form-table">
<tr>
<th><label for="wptests_phone">Телефон</label></th>
<td>
<input type="text" name="wptests_phone" id="wptests_phone" value="<?php echo esc_attr( $phone ); ?>" class="regular-text" />
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'wptests_show_phone_field' );
add_action( 'edit_user_profile', 'wptests_show_phone_field' );
function wptests_save_phone_field_profile( $user_id ) {
if ( ! current_user_can( 'edit_user', $user_id ) ) {
return false;
}
if ( isset( $_POST['wptests_phone'] ) ) {
update_user_meta( $user_id, 'wptests_phone', sanitize_text_field( $_POST['wptests_phone'] ) );
}
}
add_action( 'personal_options_update', 'wptests_save_phone_field_profile' );
add_action( 'edit_user_profile_update', 'wptests_save_phone_field_profile' );
После добавления этого кода в профиле пользователя появится поле для телефона, которое можно редактировать.
Использование плагинов для расширения форм регистрации
Если не хочется писать код самостоятельно, можно использовать специализированные плагины. Один из популярных вариантов — User Registration. Он позволяет создавать формы с любым количеством полей через визуальный конструктор и интегрируется с WooCommerce и другими расширениями.
Для оптимизации и ускорения работы сайта рекомендую обратить внимание на Clearfy Pro, который помогает убрать лишние запросы и оптимизировать регистрацию.
Вывод дополнительных данных на сайте и в письмах
После того, как дополнительные поля добавлены и сохранены, часто необходимо вывести эти данные на сайте, например, в личном кабинете или в письмах, которые отправляются при регистрации.
Для вывода телефона в шаблоне темы используйте:
$phone = get_user_meta( get_current_user_id(), 'wptests_phone', true );
echo 'Ваш телефон: ' . esc_html( $phone );
Для добавления данных в письмо о регистрации можно воспользоваться фильтром wp_new_user_notification_email и добавить туда телефон.
Резюме и советы по безопасности
Добавление дополнительных полей в форму регистрации — несложный, но мощный инструмент. Главное — не забывать про валидацию, очистку данных и безопасность. Никогда не доверяйте входным данным без фильтрации. Для хранения используйте update_user_meta, а при выводе — функции экранирования.
Этот подход можно расширять и на другие формы, например, вход, комментарии, контактные формы.
Если вы используете темы от WPSHOP, то код легко адаптируется под них, сохраняя совместимость и стандарты.