$ user_login wird nach dem Schlüssel nicht an den Link zum Zurücksetzen des WP-Passworts angehängt

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

  •  21-12-2019
  •  | 
  •  

Frage

Ich verwende benutzerdefinierte HTML-E-Mail-Vorlagen für Wordpress-Benachrichtigungen.

Jede Vorlage funktioniert einwandfrei.Aus irgendeinem Grund wird die Vorlage zum Zurücksetzen des Passworts (die ansonsten einwandfrei funktioniert) das nicht anhängen user_login variable am Ende des Links zum Zurücksetzen des Passworts - dies ist wichtig, damit der Schlüssel gültig ist.Der Link ohne die $user_login rendert einen Fehler "ungültiger Schlüssel" auf der Seite zum Zurücksetzen des WP-Passworts.

Ein Beispiel für die Zeichenfolge im Link finden Sie unten - beachten Sie das Fehlen login=username ganz am Ende.

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=

Hier ist der Code, mit dem ich die Vorlage ändere.Weiß jemand, warum das passiert - und wenn ja, wie ich es beheben kann?

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;
}
War es hilfreich?

Lösung 3

Für alle Interessierten ist dies eine andere Lösung:

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

Andere Tipps

Ich denke, das Problem ist, dass WordPress die Art und Weise geändert hat, wie der Benutzeraktivierungsschlüssel in der Datenbank gespeichert wird.Der Schlüssel wird gehasht, bevor er in der Tabelle wp_users gespeichert wird und $key enthält den nicht gehashten Klartext-Aktivierungsschlüssel.Die folgende Zeile Ihres Codes wird also kein Ergebnis liefern und $user_login wird leer sein.

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

Versuchen Sie dies stattdessen:

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

Bei dem ganzen Rest bin ich mir nicht ganz sicher.- aber zum einen müssen Sie Ihre Angebote richtig machen.versuchen

echo wp_login_url('url')

nicht

echo wp_login_url("url")

beispielsweise.:

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

oder versuchen Sie es

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

Außerdem - (und wenn das keine Hilfe ist) können Sie näher erläutern, wo Sie es verwenden, wie und mit welchen Vorlagen, damit wir versuchen können, tiefer zu graben?

Zusätzlich können Sie die POST-Daten verwenden, um zu überprüfen, ob der Benutzername oder die E-Mail gesendet wurde:

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();
...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top