#php #wordpress #wordpress-login
#php #wordpress #wordpress-вход
Вопрос:
В моем WordPress v5.7 у меня есть пользовательские страницы входа в систему.
Ниже приведен код, чтобы принять запрос на сброс пароля и отправить электронное письмо с пользовательской страницы входа.
add_filter("retrieve_password_message", "custom_password_reset", 99, 4);
function custom_password_reset($message, $key, $user_login, $user_data) {
$key = get_password_reset_key($user_data);
$message = sprintf(__('To reset password for %s, visit the following address:'), $user_data->user_email) . "rnrn";
$message .= site_url("wp-login.php?action=rpamp;key=$keyamp;login=" . rawurlencode($user_login), 'login') . "rnrn";
return $message;
}
Приведенный выше код генерирует приведенный ниже URL-адрес и отправляет пользователю электронное письмо.
https://www.example.com/wp-login.php?action=rpamp;key=XVBzvTRG17rKaG4brjH6amp;login=user_name
Ниже приведена форма на странице сброса пользовательского пароля:
<form name="resetpassform" id="resetpassform" action="<?php echo esc_url(network_site_url('wp-login.php?action=resetpass', 'login_post')); ?>" method="post" autocomplete="off">
<input type="hidden" id="user_login" value="<?php echo $_GET['login']; ?>" autocomplete="off" />
<input id="pass1" name="pass1" type="password" value="" placeholder="New Password" autocapitalize="off" data-reveal="1">
<input id="pass2" name="pass2" type="password" value="" placeholder="Confirm New Password" autocapitalize="off">
<input type="hidden" name="key" value="<?php echo $_GET['key']; ?>" />
<button type="submit" id="resetpass-button" name="submit">Save New Password</button>
</form>
И приведенный ниже код должен подтвердить ключ логин и сбросить пароль:
function do_password_reset() {
if ('POST' == $_SERVER['REQUEST_METHOD']) {
$rp_key = $_REQUEST['rp_key'];
$rp_login = $_REQUEST['rp_login'];
$user = check_password_reset_key($rp_key, $rp_login);
if (!$user || is_wp_error($user)) {
if ($user amp;amp; $user->get_error_code() === 'expired_key') {
wp_redirect(site_url('login/reset/?errors=expiredkey'));
} else {
wp_redirect(site_url('login/reset/?errors=invalidkey'));
}
exit;
}
if (isset($_POST['pass1'])) {
if ($_POST['pass1'] != $_POST['pass2']) {
// Passwords don't match
.....
}
if (empty($_POST['pass1'])) {
// Password is empty
.....
}
// Parameter checks OK, reset password
reset_password($user, $_POST['pass1']);
wp_redirect(site_url('login?password=changed'));
} else {
echo "Invalid request.";
}
exit;
}
}
add_action('login_form_rp', 'do_password_reset');
add_action('login_form_resetpass', 'do_password_reset');
Пользователи не могут сбросить пароль с пользовательских страниц входа в систему и получают errors=invalidkey
ошибку.
Ответ №1:
Вы не назвали поле #user_login пожалуйста, назовите его rp_login
, чтобы вы могли получить его через $_REQUEST
то же rp_key
самое, что и вы, назвав его key
<input name="rp_login" type="hidden" id="user_login" value="<?php echo $_GET['login']; ?>" autocomplete="off" />
без присвоения имени полю вы не получите значение $_REQUEST['rp_login'];
Пожалуйста, проверьте значение перед вызовом функции, которую вы получаете значение.
print_r([$rp_key , $rp_login ]);
die();
$user = check_password_reset_key($rp_key, $rp_login);
Ответ №2:
Ваша форма содержит pass1
и pass2
в качестве участников, но ваш сервер ожидает rp_key
и rp_login
, соответственно. Из-за этого они несовместимы, что приводит к нежелательному поведению, которое вы только что описали. Чтобы устранить проблему, вам нужно будет убедиться, что name
s password
input
элементов в form
совпадают с ключами, которые вы используете в серверной части, поэтому вам нужно будет либо form
name
соответствующим образом изменить s, либо ключи, которые вы предоставляете $ _REQUEST
, чтобы получить их.
Комментарии:
1.
rp_key
это ключ сброса пароля для пользователяrp_login
. В тоpass1
pass2
время как поля и предназначены для создания нового пароля и проверки соответствия. Если я неправильно понимаю, дайте мне знать.2. @theKing Я понимаю, что это намерение, но в форме нет вызываемого элемента
rp_key
. Серверная часть ожидает, что это существует, и передает его функции, как$user = check_password_reset_key($rp_key, $rp_login);