ইমেল পরিবর্তনে নিশ্চিতকরণ প্রয়োজন


10

আমি কেবল ভাবছি যে প্রতিবার ব্যবহারকারী তার / তার ইমেল ঠিকানা পরিবর্তন করে কেন ওয়ার্ডপ্রেস নিশ্চিতকরণ মেল প্রেরণ করে না।

আমরা কীভাবে জানতে পারি যে ইমেল ঠিকানাটি নকল বা ভুল টাইপযুক্ত নয়?

সুতরাং কেউ এই ফাংশনটি বাস্তবায়নের জন্য আমাকে কিছু স্নিপেট দিতে পারেন?

হালনাগাদ:

এই ধারণা।

  1. ব্যবহারকারী তার মেইল ​​পরিবর্তন করে
  2. আমরা নিশ্চিতকরণ ইমেল প্রেরণ।
  3. ব্যবহারকারী যদি নিশ্চিতকরণ লিঙ্কে ক্লিক করে X দিনের মধ্যে সেই ইমেলটি নিশ্চিত করে, তবে ইমেলটি পরিবর্তন করা উচিত। অন্যথায় আমাদের বিদ্যমান ইমেল ব্যবহার করা উচিত।

সুতরাং যদি ব্যবহারকারী তার / তার ইমেল পরিবর্তন করে তবে কী তারা তাদের ইমেল ঠিকানা পুনরায় যাচাই না করা অবধি লগ আউট হয়ে যায় এবং ফিরে প্রবেশের অনুমতি দেয় না?
স্কট

না, এটা খারাপ হবে। যদি ব্যবহারকারী ইমেল ঠিকানাটি ভুল টাইপ করে এবং লগ আউট করে? সে / সে এটি যাচাই করতে পারে না। সুতরাং সে চিরকালের জন্য অবরুদ্ধ থাকবে। আমরা কেবল তার / তার ইমেল ঠিকানা যাচাই করার জন্য সতর্কতা বার্তা দিচ্ছি। ব্যবহারকারী যদি X ঘন্টা (24 ঘন্টা বলে) তার ইমেলটি যাচাই না করে তবে ইতিমধ্যে যাচাই করা মেলটি ব্যবহার করা উচিত।
গিরি

প্রশ্নে এই বিবরণ রাখুন।
স্কট

উত্তর:


9

সিকহिप्পি পোস্ট করেছেন এই কার্যকারিতাটি ওয়ার্ডপ্রেসের দেশীয় তবে কেবল একটি মাল্টিসাইট সেটআপের জন্য তাই এখানে একটি দুটি সাইট সেটআপে কাজ করার জন্য আপনাকে দুটি ফাংশন দেয়ার দরকার যা মূলত মূলটি থেকে একটির জন্য কোড এক are /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');

হাই, আপনার যাচাইকরণের_ইমেল_চেঞ্জ ফাংশনে মাল্টিসাইট সম্পর্কিত কোড ($ $ wpdb-> সাইনআপস) রয়েছে। আপনি এটা ঠিক করতে পারবো?
গিরি

3

এটি একটি অদ্ভুত 'বৈশিষ্ট্য'। ফাংশনটি আসলে ওয়ার্ডপ্রেসের ভিতরে পাওয়া যায় (ওয়ার্ডপ্রেস.কম এটি তাদের পরিচালিত ব্লগ পরিষেবার জন্য সক্ষম করেছে), তবে এটি মাল্টিসাইটে সীমাবদ্ধ। আপনি যদি সন্ধান করেন তবে /wp-admin/includes/ms.phpআপনি এই ফাংশনটি হ্যান্ডেল পাবেন - 239 লাইন send_confirmation_on_profile_email()

সম্ভবত, আপনি এই ফাংশনটি আপনার ফাংশন.এফপি বা একটি কার্যকারিতা অর্জনের জন্য একটি প্লাগইনে স্থানান্তরিত করতে পারেন, সম্ভবত এটি সঠিকভাবে কাজ করার জন্য কিছুটা টুইট করে। এটা তোলে "কেন", কিন্তু তন্ন তন্ন এই বিষয় উপর TRAC টিকেট করে উত্তর না এখানে

ইটিএ: এটি আরও খতিয়ে দেখলে আরও কয়েকটি ফাংশন রয়েছে যা আপনাকে নকল করতেও পারে - 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');

চিয়ার্স।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.