$user_login не добавляется к ссылке для сброса пароля WP после ключа
-
21-12-2019 - |
Вопрос
Я использую пользовательские шаблоны электронной почты HTML для уведомлений Wordpress.
Каждый шаблон работает нормально.Однако по какой-то причине шаблон сброса пароля (который в противном случае работает нормально) не добавит user_login
переменная в конце ссылки для сброса пароля, которая жизненно важна для того, чтобы ключ был действительным.Ссылка без $user_login
выдает ошибку «неверный ключ» на странице сброса пароля WP.
Пример строки по ссылке ниже — обратите внимание на недостающие login=username
в самом конце.
url/wp-login.php?redirect_to=url?action=rp&key=12345678910&login=http://url.com/wp-login.php?redirect_to=url?action=rp&key=12345678910&login=
Вот код, который я использую для изменения шаблона.Кто-нибудь знает, почему это происходит, и если да, то как я могу это исправить?
add_filter ('retrieve_password_message', 'custom_retrieve_password_message', 10, 2);
function custom_retrieve_password_message($content, $key) {
global $wpdb;
$user_login = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_activation_key = '$key'");
ob_start();
$email_subject = custom_retrieve_password_title();
include('email_header.php');
?>
<p>It looks like you need to reset your password for your account!</p>
<p>To reset your password, visit the following address, otherwise just ignore this email and nothing will happen.<p>
<a href="<?php echo wp_login_url("url") ?>?action=rp&key=<?php echo $key ?>&login=<?php echo $user_login ?>">Reset password</a>
<?php
include('email_footer.php');
$message = ob_get_contents();
ob_end_clean();
return $message;
}
Решение 3
Кому интересно, вот еще одно решение:
add_filter ('retrieve_password_message', 'custom_retrieve_password_message', 10, 2);
function custom_retrieve_password_message($content, $key) {
global $wpdb;
if ( empty( $_POST['user_login'] ) ) {
wp_die('<strong>ERROR</strong>: Enter a username or e-mail address.');
} else if ( strpos( $_POST['user_login'], '@' ) ) {
$user_data = get_user_by( 'email', trim( $_POST['user_login'] ) );
}else if(!empty( $_POST['user_login'] )){
$user_data = get_user_by('login', trim( $_POST['user_login']));
}elseif ( empty( $user_data ) ){
wp_die('invalid_email', __('<strong>ERROR</strong>: There is no user registered with that email address.'));
}
$user_login_name=$user_data->user_login;
ob_start();
$email_subject = 'Your password has been changed';
include('email_header.php');
?>
<p>It looks like you need to reset your password. <br/>To reset your password, <a href="<?php echo wp_login_url("url") ?>?action=rp&key=<?php echo $key ?>&login=<?php echo $user_login_name; ?>">click here</a>, otherwise just ignore this email and nothing will happen.<p>
<?php
include('email_footer.php');
$message = ob_get_contents();
ob_end_clean();
return $message;
}
Другие советы
Я думаю, проблема в том, что WordPress изменил способ сохранения ключа активации пользователя в базе данных.Ключ хешируется перед сохранением в таблице wp_users и $key
содержит нехешированный текстовый ключ активации.Таким образом, следующая строка вашего кода не получит результата и $user_login
будет пусто.
$user_login = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_activation_key = '$key'");
Вместо этого попробуйте это:
add_filter ('retrieve_password_message', 'custom_retrieve_password_message', 10, 2);
function custom_retrieve_password_message($content, $key) {
global $wpdb;
$user_data = get_user_by_email(trim($_POST['user_login']));
$user_login = $user_data->user_login;
ob_start();
$email_subject = custom_retrieve_password_title();
include('email_header.php');
?>
<p>It looks like you need to reset your password for your account!</p>
<p>To reset your password, visit the following address, otherwise just ignore this email and nothing will happen.<p>
<a href="<?php echo wp_login_url("url") ?>?action=rp&key=<?php echo $key ?>&login=<?php echo $user_login ?>">Reset password</a>
<?php
include('email_footer.php');
$message = ob_get_contents();
ob_end_clean();
return $message;
}
Во всем остальном я не совсем уверен.- но, во-первых, вам нужно правильно цитировать.пытаться
echo wp_login_url('url')
нет
echo wp_login_url("url")
например:
<a href="<?php echo wp_login_url('url') ?>?action=rp&key=<?php echo $key ?>&login=<?php echo $user_login ?>">Reset password</a>
или попробуй
echo '<a href=' . wp_login_url("url") . '?action=rp&key='.$key.'&login='.$user_login.'>Reset password</a> ';
Также (и если это не поможет) можете ли вы подробнее рассказать, где вы его используете, как и с какими шаблонами, чтобы мы могли попытаться копнуть глубже?
Кроме того, вы можете использовать данные POST, чтобы проверить, было ли отправлено имя пользователя или адрес электронной почты:
add_filter ('retrieve_password_message', 'custom_retrieve_password_message', 10, 2);
function custom_retrieve_password_message($content, $key) {
if ( username_exists($_POST['user_login']) ){
$user_login = $_POST['user_login'];
} else {
$user_data = get_user_by_email(trim($_POST['user_login']));
$user_login = $user_data->user_login;
}
ob_start();
...