Вопрос или проблема
Я создаю пользовательскую форму регистрации, которая работает с полями для имени пользователя и электронной почты, но когда я добавляю поля для имени и фамилии, она не позволяет мне зарегистрироваться.
Вот форма:
<form id="_wb_register" action="<?php echo home_url(); ?>" method="post">
<p>
<label for="_wb_register_username"><?php _e('Имя пользователя:', 'wb'); ?></label>
<input type="text" name="username" id="_wb_register_username" />
</p>
<p>
<label for="_wb_register_user_first_name"><?php _e('Имя:', 'wb'); ?></label>
<input type="text" name="user_first_name" id="_wb_register_user_first_name" value="<?php echo esc_attr( wp_unslash( $first_name ) ); ?>" />
</p>
<p>
<label for="_wb_register_user_last_name"><?php _e('Фамилия:', 'wb'); ?></label>
<input type="text" name="user_last_name" id="_wb_register_user_last_name" value="<?php echo esc_attr( wp_unslash( $last_name ) ); ?>" />
</p>
<p>
<label for="_wb_register_email"><?php _e('Электронная почта:', 'wb'); ?></label>
<input type="email" name="email" id="_wb_register_email" />
</p>
<div class="padding" style="height: 5px;"></div>
<?php do_action('wb_user_panel_registration_form_bottom'); ?>
<p><input type="submit" value="<?php _e('Зарегистрироваться', 'wb'); ?>" class="button-primary" /></p>
</form>
А вот функция, используемая для создания пользователя после завершения регистрации:
add_action('wp_ajax__wb_register', '_wb_register_function');
add_action('wp_ajax_nopriv__wb_register', '_wb_register_function');
function _wb_register_function() {
$return = array();
$return['error'] = false;
$return['message'] = array();
//// ПОДТВЕРЖДЕНИЕ NONCE
$nonce = isset($_POST['nonce']) ? trim($_POST['nonce']) : '';
if(!wp_verify_nonce($nonce, 'wb-register-nonce'))
die('Сломано!');
//// ПОДТВЕРЖДЕНИЕ УЧЕТНЫХ ДАННЫХ
$username = isset($_POST['username']) ? trim($_POST['username']) : '';
$first_name = isset($_POST['user_first_name']) ? trim($_POST['user_first_name']) : '';
$last_name = isset($_POST['user_last_name']) ? trim($_POST['user_last_name']) : '';
$email = isset($_POST['email']) ? trim($_POST['email']) : '';
//// УБЕЖДАЕТСЯ, ЧТО ПОЛЬЗОВАТЕЛЬ ЗАПОЛНИЛ ИМЯ ПОЛЬЗОВАТЕЛЯ И ЭЛЕКТРОННУЮ ПОЧТУ
if($email == '' || !is_email($email)) { $return['error'] = true; $return['message'] = __('Пожалуйста, введите действительный адрес электронной почты.', 'wb'); }
if($last_name == '') { $return['error'] = true; $return['message'] = __('Пожалуйста, введите вашу фамилию.', 'wb'); }
if($first_name == '') { $return['error'] = true; $return['message'] = __('Пожалуйста, введите ваше имя.', 'wb'); }
if($username == '') { $return['error'] = true; $return['message'] = __('Пожалуйста, выберите имя пользователя.', 'wb'); }
///// ЕСЛИ ПОЛЬЗОВАТЕЛЬ ЗАПОЛНИЛ ИМЯ ПОЛЬЗОВАТЕЛЯ, ПАРОЛЬ, ИМЯ И ФАМИЛИЮ
if($return['error'] == false) {
$return_registration = _wb_process_user_registration($return, $email, $username, $first_name, $last_name);
$return = $return_registration;
}
echo json_encode($return);
exit;
}
//////////////////////////////////////////////////////////////////////
///// ЭТА ФУНКЦИЯ ОБРАБАТЫВАЕТ РЕГИСТРАЦИИ
//////////////////////////////////////////////////////////////////////
function _wb_process_user_registration($return, $email, $username, $first_name, $last_name) {
//// ПРОВЕРЯЕТ, СУЩЕСТВУЕТ ЛИ ИМЯ ПОЛЬЗОВАТЕЛЯ
$user = new WP_User('', $username);
if(!$user->exists()) {
//// ПРОВЕРКА EMAIL ИМЕНИ ПОЛЬЗОВАТЕЛЯ
$user = get_user_by('email', $email);
if(!$user) {
$password = wp_generate_password();
//// ТЕПЕРЬ МЫ, НАКОНЕЦ, МОЖЕМ ЗАРЕГИСТРИРОВАТЬ ПОЛЬЗОВАТЕЛЯ
$args = array(
'user_login' => esc_attr($username),
'first_name' => $first_name,
'last_name' => $last_name,
'user_email' => $email,
'user_pass' => $password,
'role' => 'submitter',
);
//// СОЗДАНИЕ ПОЛЬЗОВАТЕЛЯ
$user = wp_insert_user($args);
if(!is_object($user)) {
//// УБЕЖДАЕТСЯ, ЧТО ОН НЕ ВИДИТ ПАНЕЛЬ УПРАВЛЕНИЯ
update_user_meta($user, 'show_admin_bar_front', 'false');
$user = new WP_User($user);
Когда я отправляю форму регистрации, она дает мне ошибку ‘Пожалуйста, введите ваше имя.’, так что по крайней мере эта часть функции работает. Я не понимаю, почему имена и фамилии не регистрируются, когда имя пользователя и электронная почта работают исправно. Неужели я что-то упустил?
Вы не обрабатываете имена так же, как и другие поля:
//// ПОДТВЕРЖДЕНИЕ УЧЕТНЫХ ДАННЫХ
$username = isset($_POST['username']) ? trim($_POST['username']) : '';
$first_name = isset($fields['user_first_name']) ? sanitize_text_field(trim($fields['user_first_name'])) : '';
$last_name = isset($fields['user_last_name']) ? sanitize_text_field(trim($fields['user_last_name'])) : '';
$email = isset($_POST['email']) ? trim($_POST['email']) : '';
Обратите внимание, что вы используете $_POST['email']
и $_POST['username']
, но затем используете $fields['user_last_name']
, но в вашем коде нет переменной $fields
Кстати, я бы не использовал такие имена переменных, как $return
и так далее, это зарезервированные ключевые слова PHP, и использовать их для имен переменных не оптимально и является плохой практикой
</br></br>
<center>
<form action=""method="POST"></br></br>
Имя:<input type="text" name="first_name"></br></br>
Фамилия:<input type="text" name="last_name"></br></br>
<button class="" name="submit">отправить</button>
</form>
</center>
<style>
tr{border:1px solid red;}
</style>
Ответ или решение
Проблема, связанная с тем, что форма регистрации не обрабатывает поля «Имя» и «Фамилия», может быть связана с несколькими аспектами вашего кода. Давайте детально рассмотрим, что может быть не так, и как это исправить.
1. Неправильное извлечение данных из POST-запроса
На первый взгляд, код для извлечения данных из формы выглядит корректно, за исключением того, что вы пытаетесь получить имя и фамилию из несуществующей переменной $fields
. Вместо этого используйте $_POST
для получения этих значений. В разделе, где вы проверяете и фильтруете входящие данные, замените:
$first_name = isset($fields['user_first_name']) ? sanitize_text_field(trim($fields['user_first_name'])) : '';
$last_name = isset($fields['user_last_name']) ? sanitize_text_field(trim($fields['user_last_name'])) : '';
на
$first_name = isset($_POST['user_first_name']) ? sanitize_text_field(trim($_POST['user_first_name'])) : '';
$last_name = isset($_POST['user_last_name']) ? sanitize_text_field(trim($_POST['user_last_name'])) : '';
Это обеспечит корректное извлечение значений «Имя» и «Фамилия» из POST-запроса, отправленного формой.
2. Добавление проверок на ввод данных
Также, убедитесь, что у вас есть проверки для новых полей так же, как вы это делаете для имени пользователя и электронной почты. Например:
if ($first_name == '') {
$return['error'] = true;
$return['message'] = __('Пожалуйста, введите ваше имя.', 'wb');
}
if ($last_name == '') {
$return['error'] = true;
$return['message'] = __('Пожалуйста, введите вашу фамилию.', 'wb');
}
Убедитесь, что эти проверки добавлены в вашем коде в правильной логике, чтобы гарантировать, что каждая ошибка ошибки будет обработана.
3. Убедитесь, что ваши поля правильно отправляются
В вашем HTML-коде формы проверьте, правильно ли указаны атрибуты name
для ваших полей ввода. Они должны точно совпадать с теми, что вы используете в PHP. В вашем случае, вы использовали:
<input type="text" name="user_first_name" id="_wb_register_user_first_name" />
<input type="text" name="user_last_name" id="_wb_register_user_last_name" />
Это верно, поскольку это соответствует тому, что вы ожидаете в обработчике на стороне сервера.
4. Правильная обработка вывода ошибок
Создайте более структурированный и понятный способ вывода ошибок для пользователей. Вместо того чтобы возвращать только текст ошибки, вы можете использовать json для возврата структурированных данных, что упростит дальнейшую обработку ошибок на клиенте.
Заключение
Используя предоставленный код с внесёнными исправлениями, ваша система регистрации должна начать корректно обрабатывать вводимые данные первой и последней имени. Убедитесь, что вы также тестируете всю функциональность после внесения изменений, чтобы гарантировать, что всё работает, как ожидалось, и обеспечивает положительный пользовательский опыт.
С внедрением предложенных рекомендаций ваша форма регистрации будет более надежной и эффективной, что, без сомнения, положительно скажется на пользовательском опыте.