ईमेल परिवर्तन पर पुष्टि आवश्यक है


10

मैं सोच रहा हूं कि हर बार जब उपयोगकर्ता अपना ईमेल पता बदल देता है तो वर्डप्रेस पुष्टि मेल क्यों नहीं भेजता है।

हमें कैसे पता चलेगा कि ईमेल पता नकली या गलत नहीं है?

तो क्या कोई मुझे इस फ़ंक्शन को लागू करने के लिए कुछ स्निपेट दे सकता है?

अपडेट करें:

यहाँ विचार है।

  1. उपयोगकर्ता अपना मेल बदलता है
  2. हम पुष्टिकरण ईमेल भेजते हैं।
  3. यदि उपयोगकर्ता पुष्टिकरण लिंक पर क्लिक करके X दिनों में उस ईमेल की पुष्टि करता है, तो ईमेल को बदल दिया जाना चाहिए। और हमें मौजूदा ईमेल का उपयोग करना चाहिए।

इसलिए यदि उपयोगकर्ता अपना ईमेल बदल लेता है तो क्या वे लॉग आउट हो जाते हैं और जब तक वे अपना ईमेल पता पुन: सत्यापित नहीं करते हैं, तब तक उन्हें अनुमति नहीं दी जाती है?
स्कॉट

नहीं, वह बुरा होगा। क्या होगा यदि उपयोगकर्ता ईमेल पते को गलत करता है और लॉग आउट हो जाता है? वह इसे सत्यापित नहीं कर सकता। इसलिए वह हमेशा के लिए अवरुद्ध हो जाएगा। हम सिर्फ उसके ईमेल पते को सत्यापित करने के लिए चेतावनी संदेश दे रहे हैं। यदि उपयोगकर्ता अपने ईमेल को X घंटे (24 घंटे कहो) में सत्यापित नहीं करता है, तो पहले से ही सत्यापित मेल का उपयोग किया जाना चाहिए।
गिरि

कृपया इन विवरणों को प्रश्न में रखें।
स्कॉट

जवाबों:


9

जैसे सिकिप्पी ने पोस्ट किया यह कार्यक्षमता वर्डप्रेस के मूल निवासी है, लेकिन केवल एक मल्टीसिट सेटअप के लिए है, इसलिए यहां दो कार्य करने के लिए आपको एक ही साइट सेटअप पर काम करने की आवश्यकता है जो कोर से एक के लिए ज्यादातर कोड एक हैं। /wp-admin/user-edit.php file

function custom_send_confirmation_on_profile_email() {
    global $errors, $wpdb;
    $current_user = wp_get_current_user();
    if ( ! is_object($errors) )
        $errors = new WP_Error();

    if ( $current_user->ID != $_POST['user_id'] )
        return false;

    if ( $current_user->user_email != $_POST['email'] ) {
        if ( !is_email( $_POST['email'] ) ) {
            $errors->add( 'user_email', __( "<strong>ERROR</strong>: The e-mail address isn't correct." ), array( 'form-field' => 'email' ) );
            return;
        }

        if ( email_exists( $_POST['email'] ) ) {
            $errors->add( 'user_email', __( "<strong>ERROR</strong>: The e-mail address is already used." ), array( 'form-field' => 'email' ) );
            delete_user_meta( $current_user->ID . '_new_email' );
            return;
        }

        $hash = md5( $_POST['email'] . time() . mt_rand() );
        $new_user_email = array(
            'hash' => $hash,
            'newemail' => $_POST['email']
        );
        update_user_meta( $current_user->ID . '_new_email', $new_user_email );

        $content = apply_filters( 'new_user_email_content', __( "Dear user,

    You recently requested to have the email address on your account changed.
    If this is correct, please click on the following link to change it:
    ###ADMIN_URL###

    You can safely ignore and delete this email if you do not want to
    take this action.

    This email has been sent to ###EMAIL###

    Regards,
    All at ###SITENAME###
    ###SITEURL###" ), $new_user_email );

        $content = str_replace( '###ADMIN_URL###', esc_url( admin_url( 'profile.php?newuseremail='.$hash ) ), $content );
        $content = str_replace( '###EMAIL###', $_POST['email'], $content);
        $content = str_replace( '###SITENAME###', get_site_option( 'site_name' ), $content );
        $content = str_replace( '###SITEURL###', home_url(), $content );

        wp_mail( $_POST['email'], sprintf( __( '[%s] New Email Address' ), get_option( 'blogname' ) ), $content );
        $_POST['email'] = $current_user->user_email;
    }
}
add_action( 'personal_options_update', 'custom_send_confirmation_on_profile_email' );

// Execute confirmed email change. See send_confirmation_on_profile_email().
function verify_email_change(){
    global $errors, $wpdb;
    $current_user = wp_get_current_user();
    if (in_array($GLOBALS['pagenow'], array('profile.php')) && $current_user->ID > 0) {
        if (isset( $_GET[ 'newuseremail' ] ) && $current_user->ID ) {
            $new_email = get_user_meta( $current_user->ID . '_new_email' );
            if ( $new_email[ 'hash' ] == $_GET[ 'newuseremail' ] ) {
                $user->ID = $current_user->ID;
                $user->user_email = esc_html( trim( $new_email[ 'newemail' ] ) );
                if ( $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->users} WHERE user_login = %s", $current_user->user_login ) ) )
                    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->users} SET user_email = %s WHERE user_login = %s", $user->user_email, $current_user->user_login ) );
                wp_update_user( get_object_vars( $user ) );
                delete_user_meta( $current_user->ID . '_new_email' );
                wp_redirect( add_query_arg( array('updated' => 'true'), self_admin_url( 'profile.php' ) ) );
                die();
            }
        } elseif ( !empty( $_GET['dismiss'] ) && $current_user->ID . '_new_email' == $_GET['dismiss'] ) {
            delete_user_meta( $current_user->ID . '_new_email' );
            wp_redirect( add_query_arg( array('updated' => 'true'), self_admin_url( 'profile.php' ) ) );
            die();
        }
    }
}
add_action('plugins_loaded','verify_email_change');

नमस्ते, आपके verify_email_change फ़ंक्शन में मल्टीसाइट संबंधित कोड ({$ wpdb-> साइनअप) हैं। क्या आप इसे ठीक कर सकते हैं?
गिरी

3

यह एक अजीब 'फीचर' है। फ़ंक्शन वास्तव में वर्डप्रेस के अंदर उपलब्ध है (वर्डप्रेस डॉट कॉम ने इसे उनकी प्रबंधित ब्लॉग सेवा के लिए सक्षम किया है), लेकिन यह मल्टीसाइट तक सीमित है। यदि आप देखते हैं /wp-admin/includes/ms.phpतो आपको वह फंक्शन मिलेगा जो इस लाइन 239 को संभालता है send_confirmation_on_profile_email()

संभवतः, आप इस फ़ंक्शन को अपने कार्य में स्थानांतरित कर सकते हैं। इस कार्यक्षमता को प्राप्त करने के लिए एक प्लगइन में या संभवत: इसे ठीक करने के लिए इसे प्राप्त करने के लिए संभवत: थोड़ी सी ट्वीकिंग के साथ। यह "क्यों" का जवाब नहीं देता है, लेकिन इस विषय पर टीआरसी टिकट यहां नहीं है

ईटीए: इसमें और खोज करते हुए, कुछ अन्य कार्य हैं जिन्हें आपको डुप्लिकेट करने की आवश्यकता हो सकती है - new_user_email_admin_notice()और update_option_new_admin_email()संभावित रूप से बाहर कूद सकते हैं।


2

गिरी की प्रतिक्रिया मेरे लिए कारगर नहीं रही। मुझे इसे काम करने के लिए ट्विन करना पड़ा (वर्डप्रेस 3.5)

function cleanup_verify_email_change()
{
    global $errors, $wpdb;
    $current_user = wp_get_current_user();

    // don't execute this if they're trying to dismiss a pending email change
    if (in_array($GLOBALS['pagenow'], array('profile.php')) && $current_user->ID > 0 & !isset($_GET["dismiss"])) 
    {
        if (isset( $_POST[ 'email' ] ) && ($current_user->user_email != $_POST['email']) ) 
        {
            $user->ID = $current_user->ID;
            $user->user_email = esc_html( trim( $_POST[ 'email' ] ) );

            if ( $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->users} WHERE user_login = %s", $current_user->user_login ) ) ) {
                $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->users} SET user_email = %s WHERE user_login = %s", $user->user_email, $current_user->user_login ) );
            }

            wp_update_user( get_object_vars( $user ) );

            wp_redirect( add_query_arg( array('updated' => 'true', 'multisite_cleanup' => 'true'), self_admin_url( 'profile.php' ) ) );
            die();
        } 
        elseif ( !empty( $_GET['dismiss'] ) && $current_user->ID . '_new_email' == $_GET['dismiss'] ) 
        {
            delete_user_meta( $current_user->ID . '_new_email' );
            wp_redirect( add_query_arg( array('updated' => 'true', 'multisite_cleanup' => 'true'), self_admin_url( 'profile.php' ) ) );
            die();
        }
    }
}
add_action('plugins_loaded','cleanup_verify_email_change');

0

मैंने गिरी कोड को ट्विक किया है ताकि यह मेरे वर्डप्रेस (संस्करण 4.8.1+) पर काम करे

इससे पहले:

 update_user_meta( $current_user->ID . '_new_email', $new_user_email );

उपरांत:

 update_user_meta( $current_user->ID, '_new_email', $new_user_email );

अल्पविराम को अवधि बदलने की आवश्यकता है।

इसके अलावा:

$new_email['hash'];
$new_email['newemail'];

बन गया

$new_email[0]['hash'];
$new_email[0]['newemail'];

इसलिए:

function custom_send_confirmation_on_profile_email() {
    global $errors, $wpdb;
    $current_user = wp_get_current_user();
    if ( ! is_object($errors) )
        $errors = new WP_Error();

    if ( $current_user->ID != $_POST['user_id'] )
        return false;

    if ( $current_user->user_email != $_POST['email'] ) {
        if ( !is_email( $_POST['email'] ) ) {
            $errors->add( 'user_email', __( "<strong>ERROR</strong>: The e-mail address isn't correct." ), array( 'form-field' => 'email' ) );
            return;
        }

        if ( email_exists( $_POST['email'] ) ) {
            $errors->add( 'user_email', __( "<strong>ERROR</strong>: The e-mail address is already used." ), array( 'form-field' => 'email' ) );
            delete_user_meta( $current_user->ID, '_new_email' );
            return;
        }

        $hash = md5( $_POST['email'] . time() . mt_rand() );
        $new_user_email = array(
            'hash' => $hash,
            'newemail' => $_POST['email']
        );
        update_user_meta( $current_user->ID, '_new_email', $new_user_email );

        $content = apply_filters( 'new_user_email_content', __( "Dear user,

        You recently requested to have the email address on your account changed.
        If this is correct, please click on the following link to change it:
        ###ADMIN_URL###

        You can safely ignore and delete this email if you do not want to
        take this action.

        This email has been sent to ###EMAIL###

        Regards,
        All at ###SITENAME###
        ###SITEURL###" ), $new_user_email );

        $content = str_replace( '###ADMIN_URL###', esc_url( admin_url( 'profile.php?newuseremail='.$hash ) ), $content );
        $content = str_replace( '###EMAIL###', $_POST['email'], $content);
        $content = str_replace( '###SITENAME###', get_site_option( 'site_name' ), $content );
        $content = str_replace( '###SITEURL###', home_url(), $content );

        wp_mail( $_POST['email'], sprintf( __( '[%s] New Email Address' ), get_option( 'blogname' ) ), $content );
        $_POST['email'] = $current_user->user_email;
    }
}
add_action( 'personal_options_update', 'custom_send_confirmation_on_profile_email' );

// Execute confirmed email change. See send_confirmation_on_profile_email().
function verify_email_change(){
    global $errors, $wpdb;
    $current_user = wp_get_current_user();
    if (in_array($GLOBALS['pagenow'], array('profile.php')) && $current_user->ID > 0) {
        if (isset( $_GET[ 'newuseremail' ] ) && $current_user->ID ) {
            $new_email = get_user_meta( $current_user->ID, '_new_email' );
            if ( $new_email[0]['hash'] == $_GET[ 'newuseremail' ] ) {
                $user->ID = $current_user->ID;
                $user->user_email = esc_html( trim( $new_email[0][ 'newemail' ] ) );
                if ( $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->users} WHERE user_login = %s", $current_user->user_login ) ) )
                    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->users} SET user_email = %s WHERE user_login = %s", $user->user_email, $current_user->user_login ) );
                wp_update_user( get_object_vars( $user ) );
                delete_user_meta( $current_user->ID, '_new_email' );
                wp_redirect( add_query_arg( array('updated' => 'true'), self_admin_url( 'profile.php' ) ) );
                die();
            }
        } elseif ( !empty( $_GET['dismiss'] ) && $current_user->ID . '_new_email' == $_GET['dismiss'] ) {
            delete_user_meta( $current_user->ID, '_new_email' );
            wp_redirect( add_query_arg( array('updated' => 'true'), self_admin_url( 'profile.php' ) ) );
            die();
        }
    }
}
add_action('after_setup_theme','verify_email_change');

चीयर्स।

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