ต้องมีการยืนยันในการเปลี่ยนอีเมล


10

ฉันแค่สงสัยว่าทำไม wordpress ไม่ส่งอีเมลยืนยันทุกครั้งที่ผู้ใช้เปลี่ยนที่อยู่อีเมลของเขา / เธอ

เราจะรู้ได้อย่างไรว่าที่อยู่อีเมลไม่ใช่ของปลอมหรือพิมพ์ผิด

ทุกคนสามารถให้ตัวอย่างข้อมูลแก่ฉันเพื่อใช้งานฟังก์ชันนี้ได้หรือไม่

ปรับปรุง:

นี่คือความคิด

  1. ผู้ใช้เปลี่ยนอีเมลของเขา / เธอ
  2. เราส่งอีเมลยืนยัน
  3. หากผู้ใช้ยืนยันว่าอีเมลใน X วันโดยคลิกที่ลิงค์ยืนยันจากนั้นอีเมลควรมีการเปลี่ยนแปลง มิฉะนั้นเราควรใช้อีเมลที่มีอยู่

ดังนั้นหากผู้ใช้เปลี่ยนอีเมลพวกเขา / เธอจะออกจากระบบและไม่ได้รับอนุญาตจนกว่าพวกเขาจะยืนยันที่อยู่อีเมลของพวกเขาอีกครั้ง?
สกอตต์

ไม่นั่นจะไม่ดี ถ้าผู้ใช้พิมพ์ที่อยู่อีเมลผิดและออกจากระบบ เขา / เธอไม่สามารถตรวจสอบได้ ดังนั้นเขา / เธอจะถูกบล็อกตลอดไป เราเพียงแค่ส่งข้อความเตือนเพื่อยืนยันที่อยู่อีเมลของเขา / เธอ หากผู้ใช้ไม่ได้ยืนยันอีเมลของเขา / เธอใน X ชั่วโมง (พูด 24 ชั่วโมง) ควรใช้จดหมายที่ได้รับการยืนยันแล้ว
Giri

กรุณาใส่รายละเอียดเหล่านี้ในคำถาม
สกอตต์

คำตอบ:


9

เช่นเดียวกับ SickHippie ที่โพสต์ฟังก์ชั่นนี้เป็นของ WordPress แต่สำหรับการตั้งค่าแบบ multisite ดังนั้นนี่คือสองฟังก์ชั่นที่คุณต้องใช้เพื่อให้มันทำงานบนการตั้งค่าไซต์เดียวซึ่งส่วนใหญ่เป็นรหัสหนึ่งสำหรับแกน /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-> การสมัครใช้งาน) คุณซ่อมได้หรือไม่?
Giri

3

นี่คือ 'คุณสมบัติ' ที่แปลก ฟังก์ชั่นนี้สามารถใช้งานได้จริงภายใน WordPress (WordPress.com เปิดใช้งานสำหรับบริการบล็อกที่มีการจัดการ) แต่ถูก จำกัด ให้ใช้หลายไซต์ ถ้าคุณดูใน/wp-admin/includes/ms.phpคุณจะพบฟังก์ชั่นที่จัดการนี้ - สาย send_confirmation_on_profile_email()239

สันนิษฐานว่าคุณสามารถย้ายฟังก์ชั่นนี้ไปไว้ในฟังก์ชั่นของคุณหรือไปยังปลั๊กอินเพื่อรับฟังก์ชั่นนี้ได้ มันไม่ได้คำตอบว่า "ทำไม" แต่ไม่ไม่ตั๋ว Trac ในเรื่องนี้ที่นี่

การทางพิเศษแห่งประเทศไทย: มองไปข้างหน้ามันมีฟังก์ชั่นอื่น ๆ ที่คุณอาจจำเป็นต้องทำซ้ำเช่นกัน - new_user_email_admin_notice()และupdate_option_new_admin_email()กระโดดออกไปตามที่จำเป็น


2

คำตอบของ Giri ไม่ได้ผลสำหรับฉัน ฉันต้องปรับแต่งของฉันเพื่อให้มันทำงานได้ (Wordpress 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

ฉันได้ปรับแต่งรหัส Giri เพื่อให้ทำงานบน wordpress ของฉัน (เวอร์ชั่น 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.