В стандартной форме регистрации WordPress доступно минимальное количество полей: имя пользователя, адрес электронной почты и пароль. Однако часто возникает необходимость расширить форму новыми полями, например, добавить выбор пола, дату рождения или согласие с правилами. В этой статье подробно разберем, как добавить дополнительное поле в форму регистрации, обработать его на сервере и сохранить данные, используя собственные префиксы функций для избежания конфликтов.
Почему стоит добавлять дополнительные поля в форму регистрации WordPress
Дополнительные поля позволяют собирать важную информацию о пользователях сразу при регистрации без необходимости последующей доработки профиля. Это актуально для сайтов с кастомными ролями, образовательных платформ, интернет-магазинов и сообществ. С помощью правильной реализации можно обеспечить валидацию, защиту от спама и удобный вывод данных в административной части.
Добавление поля в форму регистрации WordPress
Для начала используем хук register_form, который позволяет вставить HTML перед кнопкой регистрации. Создадим поле «Телефон» с классом и идентификатором для стилизации и валидации.
function wpapp_add_phone_field_to_registration() {
$phone = isset($_POST['wpapp_phone']) ? esc_attr($_POST['wpapp_phone']) : '';
echo '<p><label for="wpapp_phone">Телефон <span style="color:red;">*</span></label><br /><input type="text" name="wpapp_phone" id="wpapp_phone" class="input" value="' . $phone . '" size="25" /></p>';
}
add_action('register_form', 'wpapp_add_phone_field_to_registration');Здесь мы выводим поле с сохранением введенного значения при ошибках регистрации.
Валидация дополнительного поля при регистрации
Чтобы проверить правильность заполнения поля и обязательность, используем хук registration_errors. Добавим проверку, что поле не пустое и содержит только цифры и символы +, -, пробел.
function wpapp_validate_phone_field($errors, $sanitized_user_login, $user_email) {
if (empty($_POST['wpapp_phone'])) {
$errors->add('wpapp_phone_error', '<strong>Ошибка</strong>: Пожалуйста, укажите телефон.');
} else {
$phone = trim($_POST['wpapp_phone']);
if (!preg_match('/^[0-9+\-\s]+$/', $phone)) {
$errors->add('wpapp_phone_error_format', '<strong>Ошибка</strong>: Телефон должен содержать только цифры, пробелы, + и -.');
}
}
return $errors;
}
add_filter('registration_errors', 'wpapp_validate_phone_field', 10, 3);Таким образом, если пользователь забудет заполнить поле или введет неверный формат, регистрация не пройдет, и выведется соответствующее сообщение.
Сохранение дополнительного поля в метаданные пользователя
После успешной регистрации нужно сохранить номер телефона в метаданные пользователя. Для этого используем хук user_register, который получает ID нового пользователя.
function wpapp_save_phone_field($user_id) {
if (!empty($_POST['wpapp_phone'])) {
update_user_meta($user_id, 'wpapp_phone', sanitize_text_field($_POST['wpapp_phone']));
}
}
add_action('user_register', 'wpapp_save_phone_field');Данные будут надежно сохранены и доступны для вывода в профиле и других местах.
Вывод дополнительного поля в административной панели WordPress
Чтобы администраторы могли видеть и редактировать добавленное поле, нужно расширить экран редактирования пользователя. Для вывода используем хуки show_user_profile и edit_user_profile:
function wpapp_show_phone_field_in_profile($user) {
$phone = get_user_meta($user->ID, 'wpapp_phone', true);
?>
<h2>Дополнительная информация</h2>
<table class="form-table">
<tr>
<th><label for="wpapp_phone">Телефон</label></th>
<td>
<input type="text" name="wpapp_phone" id="wpapp_phone" value="<?php echo esc_attr($phone); ?>" class="regular-text" />
</td>
</tr>
</table>
<?php
}
add_action('show_user_profile', 'wpapp_show_phone_field_in_profile');
add_action('edit_user_profile', 'wpapp_show_phone_field_in_profile');Для сохранения введенного значения добавим обработчик на хуки personal_options_update и edit_user_profile_update:
function wpapp_save_phone_field_in_profile($user_id) {
if (!current_user_can('edit_user', $user_id)) {
return false;
}
if (isset($_POST['wpapp_phone'])) {
update_user_meta($user_id, 'wpapp_phone', sanitize_text_field($_POST['wpapp_phone']));
}
}
add_action('personal_options_update', 'wpapp_save_phone_field_in_profile');
add_action('edit_user_profile_update', 'wpapp_save_phone_field_in_profile');Дополнительные советы по реализации и безопасности
1. Используйте уникальные префиксы для функций и мета-ключей, чтобы избежать конфликтов с другими плагинами.
2. Всегда применяйте функции очистки данных, такие как sanitize_text_field и esc_attr, чтобы предотвратить XSS и другие уязвимости.
3. При необходимости добавьте защиту reCAPTCHA или аналогичные меры для защиты от спама.
4. Можно интегрировать дополнительное поле с плагинами, например, для отправки SMS-уведомлений или проверки телефона через API.
5. Для быстрого старта можно использовать плагин Clearfy, который позволяет настраивать формы и оптимизировать работу сайта.
Заключение
Добавление дополнительных полей в форму регистрации WordPress — задача, которую можно решить с минимальными знаниями PHP и хуков WordPress. Представленные примеры кода показывают, как расширить стандартную форму, обеспечить валидацию, сохранить данные и вывести их в админке. Это позволит собрать необходимую информацию о пользователях прямо при регистрации без установки громоздких плагинов.