$user_login no se agrega al enlace de restablecimiento de contraseña de WP después de la clave

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

  •  21-12-2019
  •  | 
  •  

Pregunta

Estoy usando plantillas de correo electrónico personalizadas HTML para notificaciones de Wordpress.

Cada plantilla funciona bien.Sin embargo, por alguna razón: la plantilla de restablecimiento de contraseña (que de lo contrario funciona bien) no agregará el user_login variable al final del enlace de restablecimiento de contraseña, que es vital para que la clave sea válida.El enlace sin el $user_login genera un error de "clave no válida" en la página de restablecimiento de contraseña de WP.

A continuación se muestra un ejemplo de la cadena en el enlace; tenga en cuenta lo que falta login=username al final.

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=

Aquí está el código que estoy usando para modificar la plantilla.¿Alguien sabe por qué sucede esto y, de ser así, cómo puedo solucionarlo?

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;
}
¿Fue útil?

Solución 3

Para cualquiera interesado, esta es otra solución:

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

Otros consejos

Creo que el problema es que WordPress cambió la forma en que se guarda la clave de activación del usuario en la base de datos.La clave se procesa antes de guardarla en la tabla wp_users y $key contiene la clave de activación en texto plano sin hash.Entonces la siguiente línea de su código no obtendrá un resultado y $user_login estará vacío.

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

Pruebe esto en su lugar:

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

Del resto no estoy totalmente seguro.Pero, para empezar, es necesario que las cotizaciones sean correctas.intentar

echo wp_login_url('url')

no

echo wp_login_url("url")

p.ej.:

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

o tratar

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

Además (y si eso no sirve de ayuda), ¿puede explicarnos más dónde se usa, cómo y con qué plantillas para que podamos intentar profundizar más?

Además, puede utilizar los datos POST para comprobar si se envió el nombre de usuario o el correo electrónico:

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();
...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top