केवल उपयोगकर्ता नाम के साथ ईमेल कैसे लॉगिन करें?


20

कुछ दिनों के लिए खोज करने और 2 साल पुराने धागे पढ़ने के बाद मुझे केवल ईमेल द्वारा उपयोगकर्ता लॉगिन करने की समस्या का हल खोजने में कठिनाई हो रही है।

पहले तो मुझे WP_Email_Login देखकर ही खुशी हुई कि आप अभी भी अपने उपयोगकर्ता नाम का उपयोग लॉगिन करने के लिए कर सकते हैं। मुझे यकीन नहीं है कि इसे एक प्लगइन के रूप में लिखने के बारे में कैसे जाना जाए। मेरा विचार register_new_user फ़ंक्शन को ओवरराइड करना है। मैंने इसे "प्लगेबल" फ़ंक्शन सूची में नहीं देखा। क्या मैं फ़िल्टर / कार्रवाई का उपयोग कर सकता हूं?

मुझे लगता है कि यह कोर फ़ाइलों को संपादित करने के लिए फैशनेबल नहीं है, इसलिए मैं उम्मीद कर रहा हूं कि कोई समाधान नहीं है, लेकिन अगर कोई मौजूद नहीं है तो मैं अपना मौका लूंगा। Wp-login.php में "register_new_user" फ़ंक्शन की पहली पंक्ति में मैं जोड़ सकता हूं:

$nickname_variable(??) = $user_login // set the nickname to the username
$user_login = $user_email; // set the user_login/username to the email address

यह काफी अच्छी तरह से काम करता है क्योंकि वर्डप्रेस लोगों को अपना उपयोगकर्ता नाम बदलने की अनुमति नहीं देता है। रजिस्टर स्क्रीन (फॉर्म) में यह यूजरनेम और ईमेल के लिए पूछता है; मैं उपयोगकर्ता नाम को उपनाम चर में सेट करना चाहूंगा (यदि कोई मुझे बता सकता है कि उपनाम चर क्या कहलाता है या पंजीकरण के दौरान इसे कहां सेट किया गया है जिसकी सराहना की जाएगी)।

चीयर्स,

लोहार


क्या आप पूरी तरह से उपयोगकर्ता नामों के साथ दूर करने की कोशिश कर रहे हैं? ईमेल लॉगिन प्लगइन आपके लिए काम क्यों नहीं करेगा?
रयान

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

1
@ रयान- मुझे नहीं लगता कि मैं उपयोगकर्ता नाम से छुटकारा पा सकूंगा इसलिए इसके बजाय मैं केवल उपयोगकर्ता नाम ईमेल पते के लिए मजबूर कर रहा हूं।
agentmith666

@SickHippie - लॉगिन के लिए मुझे लगता है कि ईमेल उपयोगकर्ता नाम से बेहतर और अद्वितीय है। जब उपयोगकर्ता पोस्ट करता है तो मैं उपयोगकर्ता नाम के रूप में उपयोग करूँगा। आप सही हैं कि यह "उपयोगकर्ता नाम" के "छुटकारा" पाने के लिए एक दर्द होगा, यही कारण है कि मैं नहीं हूं। मैं केवल उपयोगकर्ता के लिए उपयोगकर्ता नाम चुन रहा हूं जब वे पंजीकरण करते हैं (उपयोगकर्ता नाम उनका ईमेल पता होगा; उनका उपनाम वही होगा जो उन्होंने अपने उपयोगकर्ता नाम के रूप में दर्ज किया है)। अंत में कोई चर खो जाता है सब कुछ बरकरार है।
Agentmith666

1
@SickHippie - आप सही हैं क्योंकि Wordpress का डिफ़ॉल्ट उपयोगकर्ता को अपना उपयोगकर्ता नाम बदलने की अनुमति देने के लिए नहीं है, भले ही वे अपने संपर्क ईमेल पते को बदलने के लिए थे। मैंने माना है कि शुरुआत से और अपने अनुभव से मैंने पाया है कि लोग ईमेल पते को शायद ही कभी "हटा "ते हैं। वे नए मिल सकते हैं लेकिन आम तौर पर वे अभी भी अपने पुराने वाले होंगे। और शायद उन दुर्लभ परिस्थितियों में नहीं तो हम इसे डेटाबेस में मैन्युअल रूप से बदल देंगे। मैं वास्तव में आपकी प्रतिक्रिया और अंतर्दृष्टि SickHippie की सराहना करता हूं! अब मैं अपनी पोस्ट के समाधान की आशा करता हूं :)
Agentmith666

जवाबों:


19

अद्यतन: मैंने लॉगिन, पंजीकरण और ईमेल के साथ पासवर्ड पुनः प्राप्त करने के लिए एक प्लगइन बनाया है। https://wordpress.org/plugins/smart-wp-login/

संक्षेप में उत्तर दें, आप वर्डप्रेस को ईमेल से लॉगिन करने के लिए कॉन्फ़िगर कर सकते हैं।

तीन चरण:

  • डिफ़ॉल्ट प्रमाणीकरण फ़ंक्शन निकालें
  • कस्टम प्रमाणीकरण फ़ंक्शन जोड़ें
  • पाठ "यूजरनाम" को wp-login.php में बदलकर "ईमेल" करें

एक नोट:

  • कोर फ़ाइलों को संपादित न करें।

वर्डप्रेस डिफ़ॉल्ट प्रमाणीकरण फ़ंक्शन निकालें।

उपयोगकर्ता लॉगिन पर अतिरिक्त सत्यापन करने के लिए वर्डप्रेस " प्रमाणित " फिल्टर का उपयोग करता है ।

remove_filter('authenticate', 'wp_authenticate_username_password', 20);

कस्टम प्रमाणीकरण फ़ंक्शन जोड़ें

add_filter('authenticate', function($user, $email, $password){

    //Check for empty fields
    if(empty($email) || empty ($password)){        
        //create new error object and add errors to it.
        $error = new WP_Error();

        if(empty($email)){ //No email
            $error->add('empty_username', __('<strong>ERROR</strong>: Email field is empty.'));
        }
        else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //Invalid Email
            $error->add('invalid_username', __('<strong>ERROR</strong>: Email is invalid.'));
        }

        if(empty($password)){ //No password
            $error->add('empty_password', __('<strong>ERROR</strong>: Password field is empty.'));
        }

        return $error;
    }

    //Check if user exists in WordPress database
    $user = get_user_by('email', $email);

    //bad email
    if(!$user){
        $error = new WP_Error();
        $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
        return $error;
    }
    else{ //check password
        if(!wp_check_password($password, $user->user_pass, $user->ID)){ //bad password
            $error = new WP_Error();
            $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
            return $error;
        }else{
            return $user; //passed
        }
    }
}, 20, 3);

पाठ "यूजरनाम" को wp-login.php में बदलकर "ईमेल" करें

हम कोर फ़ाइलों को संपादित किए बिना टेक्स्ट "यूजरनेम" को "ईमेल" में बदलने के लिए गेटटेक्स्ट फिल्टर का उपयोग कर सकते हैं ।

add_filter('gettext', function($text){
    if(in_array($GLOBALS['pagenow'], array('wp-login.php'))){
        if('Username' == $text){
            return 'Email';
        }
    }
    return $text;
}, 20);

मैंने अपने ब्लॉग http://www.thebinary.in/blog/wordpress-login-use-emad/ पर एक विस्तृत लेख भी लिखा है


2
अच्छा उत्तर निशांत
एंड्रयू बार्टेल

उपयोगी! मेरे मामले में मैं सिर्फ विशेष पात्रों को ईमेल करता हूं और इसे एक उपयोगकर्ता नाम बनाता हूं। इसलिए user@example.com user_example_com बन जाता है और यह काम करता है।
wpcoder

6

यह संभव है, आपको नाम के लिए फ़िल्टर बदलना होगा।

// remove the default filter
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// add custom filter
add_filter( 'authenticate', 'fb_authenticate_username_password', 20, 3 );
function fb_authenticate_username_password( $user, $username, $password ) {

    // If an email address is entered in the username box, 
    // then look up the matching username and authenticate as per normal, using that.
    if ( ! empty( $username ) )
        $user = get_user_by( 'email', $username );

    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;

    // using the username found when looking up via email
    return wp_authenticate_username_password( NULL, $username, $password );
}

एक विकल्प एक प्लगइन है, वहाँ आप प्लगइन रेपो में Google ओडर के माध्यम से पाते हैं; शायद यह प्लगइन


उत्तर के लिए धन्यवाद, हालांकि मुझे यकीन नहीं है कि आप मेरी पोस्ट पढ़ते हैं या यदि मैं पर्याप्त स्पष्ट नहीं था। मैं बाद के लिए माफी मांगता हूं। अपने मूल पोस्ट में मैंने WP_Email_Login प्लगइन का उल्लेख किया; आपके कोड और लिंक से सटीक प्लगइन है। यहाँ मेरी मूल पोस्ट है: "सबसे पहले मुझे WP_Email_Login देखकर ही खुशी हुई कि आप अभी भी अपने उपयोगकर्ता नाम का उपयोग लॉगिन कर सकते हैं।" <--- समस्या देखें मैं अभी भी एक उपयोगकर्ता नाम का उपयोग कर सकता हूं, इसलिए यह प्लगइन काम नहीं करेगा। चूंकि मैं उन उपयोगकर्ता नामों के साथ दूर नहीं कर सकता जो मैं उपयोगकर्ता नाम को ईमेल पते के बराबर करने के लिए मजबूर करके रजिस्टर फ़ंक्शन को ओवरराइड करने के बारे में सोच रहा हूं।
agentmith666

हालांकि मैं कोर फ़ाइलों को संपादित किए बिना इसे पूरा करने का एक तरीका खोज रहा हूं। यदि यह संभव नहीं है तो ठीक है लेकिन मैं किसी भी तरह से जानना चाहूंगा। धन्यवाद!
Agentmith666

यह कोर फ़ाइलों को संपादित किए बिना एक तरीका है। कोड को एक प्लगइन में कॉपी करें, सक्रिय करें और तैयार रहें।
22

4

उपरोक्त कोड का उपयोग करना:

// Change login credentials
// remove the default filter
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// add custom filter
add_filter( 'authenticate', 'my_authenticate_username_password', 20, 3 );
function my_authenticate_username_password( $user, $username, $password ) {

    // If an email address is entered in the username box, 
    // then look up the matching username and authenticate as per normal, using that.
    if ( ! empty( $username ) ) {
        //if the username doesn't contain a @ set username to blank string
        //causes authenticate to fail
        if(strpos($username, '@') == FALSE){
                $username = '';
            }
        $user = get_user_by( 'email', $username );
        }
    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;

    // using the username found when looking up via email
    return wp_authenticate_username_password( NULL, $username, $password );
} 

हमें बस यह जांचना था कि प्रदान किया गया उपयोगकर्ता नाम कम से कम एक ईमेल की तरह दिखता है और यदि उपयोगकर्ता नाम को तोड़फोड़ नहीं करता है।


'@'उपयोगकर्ता नाम के लिए आदिम स्ट्रिंग चेक के बजाय , Wordpress में एक आसान अंतर्निहित फ़ंक्शन है: sanitize_email एक वैध ईमेल पता प्रारूप या कुछ भी नहीं sanitize_email('email¬!"@business_com'); // Returns nothing
लौटाएगा

3

यह पहले से ही है WP-CORE!

अब wordpress पहले से ही EMAIL को यूजरनेम के रूप में रजिस्टर करने की अनुमति देता है। लेकिन अगर आप पहले से पंजीकृत उपयोगकर्ताओं के बारे में बात कर रहे हैं, तो सूचीबद्ध उत्तरों का प्रयास करें।


1

ऊपर दिए गए कोड में थोड़ा संशोधन एक सुरुचिपूर्ण समाधान बनाने के लिए आवश्यक है। प्रमाणित हुक के लिए दस्तावेज़ कहा गया है कि या तो एक WP_Userवस्तु या WP_Errorवस्तु किया जाना चाहिये।

Wp_authenticate_username_password फ़ंक्शन का स्रोत कोड कुछ बहुत ही सरल जाँच से चलता है; हम केवल उन तरीकों की प्रतिकृति बना सकते हैं WP_Errorजो ईमेल पते से निपटने के लिए एक नई वस्तु बनाते हैं । वैकल्पिक रूप से, हम wp_authenticate_username_passwordकोड को जैक भी कर सकते हैं और यदि हम चाहते हैं तो इसे संशोधित कर सकते हैं, हालांकि यह तब तक अनावश्यक लगता है जब तक आप वास्तव में चीजों को कैसे अनुकूलित करना चाहते हैं। नीचे दिए गए कोड को ट्रिक करना चाहिए: (हालांकि मैंने इसे स्वयं नहीं देखा है ...)

// Remove the default authentication function
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );

// Add the custom authentication function
add_filter( 'authenticate', 'custom_authenticate_username_password', 20, 3 );

function custom_authenticate_username_password( $user, $username, $password ) {

    // Get the WP_User object based on the email address
    if ( ! empty( $username ) ) {
        $user = get_user_by( 'email', $username );
    }

    // Return a customized WP_Error object if a WP_User object was not be returned (i.e. The email doesn't exist or a regular username was provided)
    if ( ! $user ) {
        return new WP_Error( 'invalid_username_email', sprintf( __( '<strong>ERROR</strong>: Invalid username. Please log in with your email address. <a href="%s" title="Password Lost and Found">Lost your password</a>?' ), wp_lostpassword_url() ) );
    }

    // Hand authentication back over to the default handler now that we a have a valid WP_User object based on the email address
    return wp_authenticate_username_password( null, $username, $password );
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.