ตรวจสอบชื่อผู้ใช้ที่ถูกต้องในแบบฟอร์มเข้าสู่ระบบที่กำหนดเอง


10

ฉันได้ใช้การกวดวิชาของเจฟฟ์สตาร์สำหรับการสร้างแบบฟอร์มการเข้าสู่ระบบที่กำหนดเองของตัวเองhttp://digwp.com/2010/12/login-register-password-code/ มันใช้งานได้ดี แต่ฉันมีปัญหาอย่างหนึ่ง ในแบบฟอร์มรีเซ็ตรหัสผ่านหากมีคนป้อนชื่อผู้ใช้อย่างไม่ถูกต้อง (เพื่อตรวจสอบไม่ได้) พวกเขาจะถูกเตะไปที่ค่าเริ่มต้น wp-login.php? action = lostpassword พร้อมข้อความแสดงข้อผิดพลาด

มีวิธีเปลี่ยนเส้นทางไปยังหน้าข้อผิดพลาดของฉันเองหรือไม่?

ขอบคุณ!


username_exists()คุณสามารถช่วยคุณได้บ้าง
Ashfame

คำตอบ:


10

รหัสที่เขาโพสต์ในบทช่วยสอนนั้น (BTW ที่ดีมาก) โพสต์ฟอร์มไปยัง build-in "รีเซ็ตรหัสผ่าน" โมดูลซึ่งเปลี่ยนเส้นทางไปสู่ ​​login.php โดยมีข้อผิดพลาด แต่คุณสามารถเปลี่ยนได้และสร้างของคุณเองตามต้นฉบับและเพิ่ม ไปที่หน้าเทมเพลตเปลี่ยน:

<form method="post" action="<?php echo site_url('wp-login.php?action=lostpassword', 'login_post') ?>" class="wp-user-form">
    <div class="username">
        <label for="user_login" class="hide"><?php _e('Username or Email'); ?>: </label>
        <input type="text" name="user_login" value="" size="20" id="user_login" tabindex="1001" />
    </div>
    <div class="login_fields">
        <?php do_action('login_form', 'resetpass'); ?>
        <input type="submit" name="user-submit" value="<?php _e('Reset my password'); ?>" class="user-submit" tabindex="1002" />
        <?php $reset = $_GET['reset']; if($reset == true) { echo '<p>A message will be sent to your email address.</p>'; } ?>
        <input type="hidden" name="redirect_to" value="<?php echo $_SERVER['REQUEST_URI']; ?>?reset=true" />
        <input type="hidden" name="user-cookie" value="1" />
    </div>
</form>

ถึง:

<form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>" class="wp-user-form">
<div class="username">
    <label for="user_login" class="hide"><?php _e('Username or Email'); ?>: </label>
    <input type="text" name="user_login" value="" size="20" id="user_login" tabindex="1001" />
</div>
<div class="login_fields">
    <?php do_action('login_form', 'resetpass'); ?>
    <input type="submit" name="user-submit" value="<?php _e('Reset my password'); ?>" class="user-submit" tabindex="1002" />

    <?php
    if (isset($_POST['reset_pass']))
    {
        global $wpdb;
        $username = trim($_POST['user_login']);
        $user_exists = false;
        if (username_exists($username))
        {
            $user_exists = true;
            $user_data = get_userdatabylogin($username);
        } elseif (email_exists($username))
        {

            $user_exists = true;
            $user = get_user_by_email($username);
        } else
        {
            $error[] = '<p>' . __('Username or Email was not found, try again!') . '</p>';
        }
        if ($user_exists)
        {
            $user_login = $user->user_login;
            $user_email = $user->user_email;
            // Generate something random for a password... md5'ing current time with a rand salt
            $key = substr(md5(uniqid(microtime())), 0, 8);
            // Now insert the new pass md5'd into the db
            $wpdb->query("UPDATE $wpdb->users SET user_activation_key = '$key' WHERE user_login = '$user_login'");
            //create email message
            $message = __('Someone has asked to reset the password for the following site and username.') . "\r\n\r\n";
            $message .= get_option('siteurl') . "\r\n\r\n";
            $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
            $message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n";
            $message .= get_option('siteurl') . "/wp-login.php?action=rp&key=$key\r\n";
            //send email meassage
            if (FALSE == wp_mail($user_email, sprintf(__('[%s] Password Reset'), get_option('blogname')), $message))
            $error[] = '<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>';
        }
        if (count($error) > 0)
        {
            foreach ($error as $e)
            {
                echo $e . '<br/>';
            }
        } else
        {
            echo '<p>' . __('A message will be sent to your email address.') . '</p>';
        }
    }
    ?> 
    <input type="hidden" name="reset_pass" value="1" />
    <input type="hidden" name="user-cookie" value="1" />
</div>
</form>

ดูดีฉันจะแจ้งให้คุณทราบถ้ามันทำงาน
Pippin

1
โอเคฉันได้รับสิ่งนี้เพื่อการทำงานที่ยอดเยี่ยมโดยมีการเปลี่ยนแปลงเพียงเล็กน้อย มีข้อผิดพลาดทางไวยากรณ์อยู่สองสามข้อและตัวสร้างคีย์ md5 ใช้งานไม่ได้ดังนั้นฉันจึงนำสิ่งนี้มาจาก wp-login.php ฉันมีปัญหาเดียวแล้ว เมื่อมีคนคลิก URL ในอีเมลเพื่อสร้างรหัสผ่านใหม่พวกเขาจะถูกเปลี่ยนเส้นทางไปยังแบบฟอร์มเริ่มต้นดังนั้นตอนนี้ฉันต้องสร้างแบบฟอร์มสำหรับสิ่งนั้นด้วย
Pippin

@pippin: รหัสตัวสร้างคีย์ md5 ที่นี่เป็นรหัสสำหรับ wp-login.php และสำหรับการเปลี่ยนเส้นทางลองเพิ่ม&redirect_to=$_SERVER['REQUEST_URI']ไปยังลิงก์ในอีเมลที่คุณส่ง
Bainternet

ลิงก์ของฉันตอนนี้มีลักษณะเช่นนี้$message .= get_option('siteurl') . "/wp-login.php?action=rp&key=$key&login=$user_login&redirect_to=$_SERVER['REQUEST_URI']\r\n";แต่สิ่งที่แปลกคือเมื่อฉันเพิ่ม & เปลี่ยนเส้นทางข้อความจะไม่ถูกส่ง . . นอกจากนี้ฉันจะไม่ต้องสร้างแบบฟอร์มใหม่สำหรับผู้ใช้เพื่อป้อนรหัสผ่านใหม่ของพวกเขาและเช่น?
ปิ๊ปปิ้น

ใช่ฉันลืมเรื่องนั้นคุณจะต้องสร้างแบบฟอร์มของคุณเองเพื่อรีเซ็ตรหัสผ่านและอาจแทนที่ลิงค์ที่ส่งไปยังผู้ใช้ไปยัง URL ปัจจุบันและขึ้นอยู่กับการตรวจสอบที่สำคัญว่าผู้ใช้และแสดงให้เขาเห็นแบบฟอร์ม
Bainternet

8

นี่คือเวอร์ชันที่อัปเดตของโค้ดจาก @bainternet ที่แก้ไขข้อผิดพลาดทางไวยากรณ์คำแนะนำโดย @Val และตัวสร้างคีย์จาก wp-login.php 3.4.2:

global $wpdb;
$username = trim($_POST['user_login']);
$user_exists = false;
// First check by username
if ( username_exists( $username ) ){
    $user_exists = true;
    $user = get_user_by('login', $username);
}
// Then, by e-mail address
elseif( email_exists($username) ){
        $user_exists = true;
        $user = get_user_by_email($username);
}else{
    $error[] = '<p>'.__('Username or Email was not found, try again!').'</p>';
}
if ($user_exists){
    $user_login = $user->user_login;
    $user_email = $user->user_email;

    $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login));
    if ( empty($key) ) {
        // Generate something random for a key...
        $key = wp_generate_password(20, false);
        do_action('retrieve_password_key', $user_login, $key);
        // Now insert the new md5 key into the db
        $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login));
    }

    //create email message
    $message = __('Someone has asked to reset the password for the following site and username.') . "\r\n\r\n";
    $message .= get_option('siteurl') . "\r\n\r\n";
    $message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
    $message .= __('To reset your password visit the following address, otherwise just ignore this email and nothing will happen.') . "\r\n\r\n";
    $message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "&redirect_to=".urlencode(get_option('siteurl'))."\r\n";
    //send email meassage
    if (FALSE == wp_mail($user_email, sprintf(__('[%s] Password Reset'), get_option('blogname')), $message))
    $error[] = '<p>' . __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') . '</p>';
}
if (count($error) > 0 ){
    foreach($error as $e){
                echo $e . "<br/>";
            }
}else{
    echo '<p>'.__('A message will be sent to your email address.').'</p>'; 
}

1

ฉันยังคงพบปัญหาเกี่ยวกับคีย์รีเซ็ตทำงานไม่ถูกต้องลิงก์ในอีเมลจะเปลี่ยนเส้นทางฉันไปที่หน้ารีเซ็ตรหัสผ่านมาตรฐานพร้อมพารามิเตอร์ URL ที่ระบุปัญหาของคีย์ดังนั้นฉันจึงติดตามไฟล์ wp-login.php อย่างใกล้ชิดยิ่งขึ้น และรวมถึงออบเจ็กต์ $ wp_hasher สิ่งนี้จะแก้ไขปัญหาและการรีเซ็ตรหัสผ่านในอีเมลจะทำงานได้ในขณะนี้

if (($_SERVER['REQUEST_METHOD'] === (string) 'POST') && (isset($_POST['reset_pass']))) {

// Acccess global properties
global $wpdb, $wp_hasher;


// Variables
$error_pass_reset = array();
$username         = (string) trim($_POST['user_login']);
$user_exists      = (bool)   false;



// ---- USERNAME OR EMAIL EXISTS ---- //
if (username_exists($username)) {
    $user_exists = (bool)   true;
    $user        = (object) get_user_by('login', $username);
} // end if

else if (email_exists($username)) {
    $user_exists = (bool)   true;
    $user        = (object) get_user_by('email', $username);
} // end else if

else {
    $error_pass_reset[] = '<p>Username or Email was not found, please try again.</p>';
} // end else



// ---- USER EXISTS ---- //
if ($user_exists === (bool) true) {
    // Variables
    $user_login = (string) $user -> user_login;
    $user_email = (string) $user -> user_email;


    // Generate password reset key
if (empty($key)) {
    $key = (string) wp_generate_password(20, false);

    do_action('retrieve_password_key', $user_login, $key);


    // Create the $wp_hasher object
    if (empty($wp_hasher)) {
        require_once(ABSPATH . WPINC . '/class-phpass.php');

        $wp_hasher = new PasswordHash(8, true);
    }

    // Reset key with hasher applied (MD5 has string output)
    $hashed = (string) time() . ':' . $wp_hasher -> HashPassword($key);


    // Insert the new key into the database
    $wpdb -> update(
        $wpdb -> users,
        array(
            'user_activation_key' => $hashed
        ),
        array(
            'user_login' => $user_login
        )
    );
} // end if


    // Email message
    $message = (string)
    'Someone requested that the password be reset for the following account:' . "\r\n\r\n" .

    get_option('siteurl') . "\r\n\r\n" .

    'Username: ' . $user_login . "\r\n\r\n" .
    'If this was a mistake, just ignore this email and nothing will happen.' . "\r\n\r\n" .
    'To reset your password, visit the following address:' . "\r\n\r\n" .

    get_option('siteurl') . '/wp-login.php?action=rp&key=' . $key . '&login=' . $user_login . "\r\n";


    // Send email
    if ((bool) false === wp_mail($user_email, get_option('blogname') . ' Password Reset', $message)) {
        $error_pass_reset[] = '<p>The e-mail could not be sent at this time.</p>' . "\n";
    } // end if
} // end if


// Send the rest password email
do_action('login_form', 'resetpass');

} // end if (($_SERVER['REQUEST_METHOD'] === (string) 'POST') && (isset($_POST['reset_pass'])))

คำตอบที่มีรหัส wp_hasher นี้มีประโยชน์อย่างมากกับฉันเพราะฉันได้สร้างแม่แบบรหัสผ่านที่ลืมไปแล้ว
Neelam Khan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.