कस्टम लॉगिन फॉर्म पर सही उपयोगकर्ता नाम की जाँच करें


10

मैंने अपने स्वयं के कस्टम लॉगिन फ़ॉर्म http://digwp.com/2010/12/login-register-password-code/ बनाने के लिए जेफ़ स्टार के ट्यूटोरियल का उपयोग किया है । यह बहुत अच्छा काम करता है, लेकिन मुझे एक समस्या है। रीसेट पासवर्ड फॉर्म पर, यदि कोई अपने उपयोगकर्ता नाम को गलत तरीके से दर्ज करता है (ताकि यह सत्यापित नहीं होता है), तो वे डिफ़ॉल्ट wp-login.php पर किक कर जाते हैं? क्रिया = त्रुटि संदेश के साथ ह्रासवर्ड।

क्या मेरे अपने त्रुटि पृष्ठ पर पुनर्निर्देशित करने का कोई तरीका है?

धन्यवाद!


एक भीड़ में, username_exists()आप किसी तरह मदद कर सकते हैं?
आश्फेम

जवाबों:


10

वह कोड जो उसने उस ट्यूटोरियल (बहुत अच्छा BTW) में पोस्ट किया था, वह फॉर्म "इन-रीसेट पासवर्ड" मॉड्यूल में पोस्ट करता है, जो 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>

बहुत अच्छा लग रहा है, मैं आपको बता दूंगा कि क्या यह काम करता है।
पिप्पिन

1
ठीक है, मैंने इसे महान काम करने के लिए प्राप्त किया है, बस कुछ बदलावों के साथ। सिंटैक्स त्रुटियों की एक जोड़ी थी और md5 कुंजी जनरेटर काम नहीं करता था, इसलिए मैंने wp-login.php से एक लिया। मुझे अभी एक समस्या है। जब कोई व्यक्ति नया पासवर्ड बनाने के लिए ईमेल में url पर क्लिक करता है, तो वे डिफ़ॉल्ट रूप में पुनर्निर्देशित हो जाते हैं, इसलिए अब मुझे उसके लिए भी एक फ़ॉर्म बनाने की आवश्यकता है।
पिपिन

@ पिप्पिन: यहाँ md5 कुंजी जनरेटर कोड wp-login.php के लिए एक है, और &redirect_to=$_SERVER['REQUEST_URI']आपके द्वारा भेजे गए ईमेल में लिंक को जोड़ने के लिए पुनर्निर्देशन के लिए प्रयास करें ।
बेनटर्नट

मेरा लिंक अब इस तरह दिखता है $message .= get_option('siteurl') . "/wp-login.php?action=rp&key=$key&login=$user_login&redirect_to=$_SERVER['REQUEST_URI']\r\n";, लेकिन यह अजीब है कि जब मैं & पुनर्निर्देशित करता हूं, तो संदेश भेजा नहीं जाता है। । । इसके अलावा, क्या मुझे उपयोगकर्ता को अपना नया पासवर्ड दर्ज करने के लिए एक नया फॉर्म बनाने की आवश्यकता नहीं होगी और इस तरह से?
पिप्पिन

हाँ, मैं इस बारे में भूल गया था, आपको पासवर्ड रीसेट करने के लिए अपना स्वयं का फ़ॉर्म बनाने की आवश्यकता होगी और संभवतः उस लिंक को प्रतिस्थापित करें जो उपयोगकर्ता को वर्तमान url में भेजा जाता है, और कुंजी जाँच के आधार पर यदि उपयोगकर्ता इसका और उसे फ़ॉर्म दिखाता है।
बैनटर्नट

8

यहाँ सिंटैक्स त्रुटियों को सुधारा गया, @Val द्वारा सुझाव और wp-login.php 3.4.2 से प्रमुख जनरेटर के साथ @bainternet से कोड का एक अद्यतन संस्करण है:

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 कोड के साथ यह उत्तर मेरे लिए बेहद उपयोगी था क्योंकि मैंने एक कस्टम भूल पासवर्ड टेम्पलेट बनाया है।
नीलम खान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.