$ user_login ne s'ajoute pas au lien de réinitialisation du mot de passe WP après la clé

StackOverflow https://stackoverflow.com//questions/20020443

  •  21-12-2019
  •  | 
  •  

Question

J'utilise des modèles de courrier électronique personnalisés HTML pour les notifications Wordpress.

Chaque modèle fonctionne bien.Pour une raison quelconque, cependant : le modèle de réinitialisation de mot de passe (qui fonctionne correctement autrement) n'ajoutera pas le user_login variable à la fin du lien de réinitialisation du mot de passe - ce qui est vital pour que la clé soit valide.Le lien sans le $user_login affiche une erreur « clé invalide » sur la page de réinitialisation du mot de passe WP.

Un exemple de chaîne dans le lien est ci-dessous - notez ce qui manque login=username à la fin.

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=

Voici le code que j'utilise pour modifier le modèle.Est-ce que quelqu'un sait pourquoi cela se produit - et si oui, comment puis-je y remédier ?

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;
}
Était-ce utile?

La solution 3

Pour ceux que ça intéresse, voici une autre solution :

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;
}

Autres conseils

Je pense que le problème est que WordPress a changé la façon dont la clé d'activation utilisateur est enregistrée dans la base de données.La clé est hachée avant d'être enregistrée dans la table wp_users et $key contient la clé d'activation en texte brut non hachée.Ainsi, la ligne suivante de votre code n'obtiendra pas de résultat et $user_login sera vide.

$user_login = $wpdb->get_var("SELECT user_login FROM $wpdb->users WHERE user_activation_key = '$key'");

Essayez plutôt ceci :

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;
}

Je ne suis pas totalement sûr de tout le reste.- mais d'abord, vous devez obtenir des devis corrects.essayer

echo wp_login_url('url')

pas

echo wp_login_url("url")

par exemple.:

<a href="<?php echo wp_login_url('url') ?>?action=rp&key=<?php echo $key ?>&login=<?php echo $user_login ?>">Reset password</a> 

ou essaye

echo '<a href=' . wp_login_url("url") . '?action=rp&key='.$key.'&login='.$user_login.'>Reset password</a> ';

Aussi - (et si cela ne vous aide pas) pouvez-vous nous expliquer davantage où vous l'utilisez, comment et avec quels modèles afin que nous puissions essayer de creuser plus profondément ?

De plus, vous pouvez utiliser les données POST pour vérifier si le nom d'utilisateur ou l'e-mail a été soumis :

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();
...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top