Вопрос или проблема
Имя страницы с моей формой – “Регистрация”, что означает, что слаг “register”. Это первая информация, связанная с моей теорией о моей ошибке.
Когда я запускаю wp_insert_user, я получаю успех в первый раз, но имя пользователя – “register”. Поэтому последующие отправки пытаются создать пользователя “register”, и возникает ошибка “Пользователь с таким именем уже существует”.
Я проверял свои данные снова и снова, чтобы убедиться, что я не отправляю форму с именем пользователя “register”, но она всегда пытается использовать это имя пользователя.
Вот мой код:
$first_name = $data['first_name'];
$last_name = $data['last_name'];
$user_name = $data['user_name'];
$type_of_user = $data['type_of_user'];
$nickname = $first_name . " " . $last_name;
$email = $data['email_address'];
$password = wp_generate_password();
$address1 = $data['address_1'];
$address2 = $data['address_2'];
$city = $data['city'];
$state = $data['state'];
$zipcode = $data['zipcode'];
$user_photo = $data['user_photo'];
$args = array (
'user_login' => $user_name,
'user_email' => $email,
'user_pass' => $password,
'user_url' => $website,
'first_name' => $first_name,
'last_name' => $last_name,
'nickname' => $nickname,
'role' => $type_of_user
) ;
$user_id = wp_insert_user($args);
Может ли что-то в цикле постов пополнять мою форму и как это исправить. Я уже некоторое время пытаюсь разобраться с этим, но не знаю, что еще попробовать.
ИЗМЕНЕНИЕ 1: Следующий тестовый случай.
$username = "spock";
$password = wp_generate_password();
$email_address = "[email protected]";
if( null == username_exists( $username) ) {
// Генерируем пароль и создаем пользователя
$password = wp_generate_password( 12, false );
$user_id = wp_create_user( $username, $password, $email_address );
if ( $user_id && !is_wp_error( $user_id ) ) {
// Устанавливаем никнейм
wp_update_user(
array(
'ID' => $user_id,
'nickname' => $email_address
)
);
// Устанавливаем роль
$user = new WP_User( $user_id );
$user->set_role( 'contributor' );
// Отправляем почту пользователю
wp_mail( $email_address, 'Добро пожаловать!', 'Ваш пароль: ' . $password );
} else {
wp_mail("[email protected]", "Ошибка регистрации пользователя", "Попытка имени пользователя: " . $username . " . и ошибка: " . $user_id->get_error_message() . json_encode($user_id));
}
} // конец if
Этот код создает следующее при первом запуске.
А затем при следующем запуске возвращает ошибку “Извините, это имя пользователя уже существует!”, так как снова пытается создать пользователя с именем пользователя “register”.
ИЗМЕНЕНИЕ 2: Обходной путь (по-прежнему нужен ответ)
Обходной путь заключается в том, чтобы разрешить создать имя пользователя “register”, а затем быстро обновить имя пользователя на указанное, но нет причин, по которым оно должно использовать это имя пользователя. Может ли что-то фильтровать функцию wp_insert_user? Существует ли хук WP, который фильтрует это?
ИЗМЕНЕНИЕ 3: Попробовал другую страницу/слаг страницы
Я создал новую страницу под названием “тест” со слагом “test” и получил ту же ошибку, так что это не связано с этим.
Перед тем, как что-либо делать, убедитесь, что учетная запись пользователя уже не существует. Это действительно легко сделать с помощью функции username_exists.
if( null == username_exists( $username ) ) {
echo "пользователь не существует";
}
используйте приведенный выше код и посмотрите, что произойдет
затем сделайте следующее
$user_id = wp_create_user ( $email_address, $password, $email_address );
весь код, как
if( null == username_exists( $username) ) {
// Генерируем пароль и создаем пользователя
$password = wp_generate_password( 12, false );
$user_id = wp_create_user( $username, $password, $email_address );
// Устанавливаем никнейм
wp_update_user(
array(
'ID' => $user_id,
'nickname' => $email_address
)
);
// Устанавливаем роль
$user = new WP_User( $user_id );
$user->set_role( 'contributor' );
// Отправляем почту пользователю
wp_mail( $email_address, 'Добро пожаловать!', 'Ваш пароль: ' . $password );
} // конец if
если даже это не сработает, сделайте следующее
коды функции :-
//function wp_create_user($username, $password, $email="") {
//$user_login = esc_sql( $username );
//$user_email = esc_sql( $email );
//$user_pass = $password;
//$userdata = compact('user_login', 'user_email', 'user_pass');
//return wp_insert_user($userdata);
//}
используйте это тоже. используйте такую функцию codex.
$user_id = username_exists( $user_name );
if ( !$user_id and email_exists($user_email) == false ) {
$random_password = wp_generate_password( $length=12, $include_standard_special_chars=false );
$user_id = wp_create_user( $user_name, $random_password, $user_email );
} else {
$random_password = __('Пользователь уже существует. Пароль унаследован.');
}
надеюсь, это сработает
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, что функция wp_insert_user()
пытается создать пользователя с именем "register" после первого успешного выполнения, что приводит к ошибке "Пользователь с таким именем уже существует". Давайте разберем это по шагам и предложим возможные решения.
Анализ проблемы
-
Проверка входящих данных: Убедитесь, что данные, передаваемые в массив
$data
, действительно соответствуют тому, что вы ожидаете. Иногда данные могут перезаписываться или искажаться до того, как вы их передаете вwp_insert_user()
. Определите, вызывается ли функция зарегистрировать пользователя именно с именем "register". -
Использование
username_exists()
: Вы можете проверить, существует ли уже пользователь с таким именем, перед тем как пытаться его создать, но вы упомянули, что это не решает проблему.if (null == username_exists($user_name)) { // Создание пользователя } else { // Обработка ошибки }
-
Фильтры и хуки: Проверьте, нет ли каких-либо фильтров или хуков, которые могут изменять значение имени пользователя. В WordPress есть хуки, такие как
pre_user_login
, которые могут быть использованы для изменения имени пользователя перед его сохранением. -
Тестирование с другим именем: Попробуйте временно изменить часть вашего кода, чтобы отследить переменные, которые передаются в
wp_insert_user()
. Это поможет убедиться, что передаваемое имя пользователя действительно отличается от "register". -
Отладка кода: Добавьте временные отладочные сообщения, чтобы понять, какие данные используются:
error_log('Попытка создать пользователя с именем: ' . $user_name);
Исправление проблемы
На основе вышеизложенного, вот несколько шагов, которые вы можете предпринять:
-
Измените имя пользователя перед вставкой: Если имя пользователя "register" появляется случайно, возможно, стоит добавить дополнительную логику для генерации уникального имени, чтобы избежать конфликта.
if (username_exists($user_name)) { $user_name = $user_name . '_' . time(); // Модификация имени }
-
Очистка глобальных переменных: Убедитесь, что мнению пользователя не изменяется из глобальных переменных или предыдущих запросов. Возможно, вам придется добавить очистку данных перед их использованием.
-
Проверка конфликтов с плагинами: Иногда плагины могут перезаписывать стандартные функции WordPress. Отключите плагины один за другим и проверьте, ведет ли это к решению проблемы.
-
Исключение ошибок в шаблоне формы: Убедитесь, что ваша форма не содержит скрытых полей или JavaScript, который может изменять отправляемые данные.
Заключение
Проблема, с которой вы столкнулись, может быть вызвана множеством факторов, ranging from data submission errors to potential conflicts with other plugins or filters. Весь процесс стоит внимательно отлаживать, учитывая, что каждый этап может повлиять на конечный результат. Предложенные вами шаги помогают диагностировать и устранить проблему, в то время как правильное использование функций проверки уникальности имени пользователя защитит от возникновения аналогичных ситуаций в будущем.