لا يتم إلحاق $user_login برابط إعادة تعيين كلمة المرور WP بعد المفتاح

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

  •  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();
...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top