ส่งอีเมลยืนยันการใช้งานผู้ใช้เมื่อสร้างผู้ใช้โดยทางโปรแกรม


9

ฉันสงสัยว่าคนที่นี่อาจช่วยได้หรือไม่

โดยพื้นฐานแล้วฉันได้สร้างฟอร์มการลงทะเบียนที่กำหนดเองซึ่งเมื่อผ่านการตรวจสอบแล้วจะแทรกผู้ใช้ไปยังตารางผู้ใช้

function _new_user($data) {

    // Separate Data
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    wp_insert_user($default_newuser);
} 

ตอนนี้สิ่งที่ฉันต้องทำก็คือแทนที่จะส่งอีเมลยืนยันซึ่งฉันรู้ว่าฉันสามารถทำได้ด้วยรหัสต่อไปนี้

wp_new_user_notification($user_id, $data['user_pass']);

ฉันต้องการส่งอีเมลเปิดใช้งานผู้ใช้แทน ฉันลองอะไรมาบ้างแล้วแต่ฉันไม่สามารถหาอะไรที่เป็นรูปธรรมได้ หวังว่าบางคนอาจเคยมีปัญหานี้มาก่อน

คำตอบ:


10

เพื่อให้กระบวนการเปิดใช้งานของผู้ใช้สำเร็จคุณต้องทำตามขั้นตอนต่อไปนี้:

  1. หลังจากสร้างผู้ใช้ใหม่แล้วให้เพิ่มฟิลด์ผู้ใช้ที่กำหนดเองซึ่งระบุว่าผู้ใช้รายนี้ต้องเปิดใช้งานบัญชีของเขา
  2. ส่งอีเมลพร้อมรหัสเปิดใช้งานระบุลิงก์ในอีเมลนี้ไปยังหน้าเว็บที่ผู้ใช้จะเปิดใช้งาน
  3. ใช้หน้าเปิดใช้งาน
  4. เมื่อผู้ใช้พยายามเข้าสู่ระบบตรวจสอบว่าฟิลด์ผู้ใช้ที่กำหนดเองนั้นมีอยู่หรือไม่ หากมีอยู่แล้วอย่าล็อกอินเขาและแสดงข้อความข้อผิดพลาดการเปิดใช้งานแทน

เพิ่มฟิลด์ที่กำหนดเองและส่งอีเมล:

function _new_user($data) {

    // Separate Data
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    $user_id = wp_insert_user($default_newuser);
    if ( $user_id && !is_wp_error( $user_id ) ) {
        $code = sha1( $user_id . time() );
        $activation_link = add_query_arg( array( 'key' => $code, 'user' => $user_id ), get_permalink( /* YOUR ACTIVATION PAGE ID HERE */ ));
        add_user_meta( $user_id, 'has_to_be_activated', $code, true );
        wp_mail( $data['user_email'], 'ACTIVATION SUBJECT', 'CONGRATS BLA BLA BLA. HERE IS YOUR ACTIVATION LINK: ' . $activation_link );
    }
}

ตรวจสอบการเปิดใช้งานของผู้ใช้ในการเข้าสู่ระบบ:

// override core function
if ( !function_exists('wp_authenticate') ) :
function wp_authenticate($username, $password) {
    $username = sanitize_user($username);
    $password = trim($password);

    $user = apply_filters('authenticate', null, $username, $password);

    if ( $user == null ) {
        // TODO what should the error message be? (Or would these even happen?)
        // Only needed if all authentication handlers fail to return anything.
        $user = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));
    } elseif ( get_user_meta( $user->ID, 'has_to_be_activated', true ) != false ) {
        $user = new WP_Error('activation_failed', __('<strong>ERROR</strong>: User is not activated.'));
    }

    $ignore_codes = array('empty_username', 'empty_password');

    if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {
        do_action('wp_login_failed', $username);
    }

    return $user;
}
endif;

หน้าการเปิดใช้งาน:

add_action( 'template_redirect', 'wpse8170_activate_user' );
function wpse8170_activate_user() {
    if ( is_page() && get_the_ID() == /* YOUR ACTIVATION PAGE ID HERE */ ) {
        $user_id = filter_input( INPUT_GET, 'user', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
        if ( $user_id ) {
            // get user meta activation hash field
            $code = get_user_meta( $user_id, 'has_to_be_activated', true );
            if ( $code == filter_input( INPUT_GET, 'key' ) ) {
                delete_user_meta( $user_id, 'has_to_be_activated' );
            }
        }
    }
}

นี่คือจุดเริ่มต้นของคุณไปข้างหน้าและปรับให้เข้ากับความต้องการของคุณ


โพสต์ที่ดี แต่ฉันคิดว่าคุณพลาดสิ่งหนึ่ง เมื่อคุณป้องกันผู้ใช้ที่ไม่ได้รับอนุญาตเข้าสู่ระบบคุณจะได้รับ user_id จาก get_current_user_id () ในหน้าการเปิดใช้งานได้อย่างไร
s1lv3r

1
ประณาม ... :) จุดดีจะแก้ไขได้ในไม่กี่นาที :)
Eugene Manuilov

ขอบคุณสำหรับข้อมูลที่น่าอัศจรรย์นี้ ฉันเห็นว่ามีวิธีการแก้ปัญหาหลักใด ๆ ที่เพิ่งเรียกการส่งอีเมลการเปิดใช้งานเนื่องจากคุณสามารถ 'ส่งการเปิดใช้งานอีกครั้ง' ในแผงการดูแลระบบ ฉันคิดว่าการใส่ผู้ใช้ในระหว่างรอรหัสเปิดใช้งานอาจถูกสร้างและแทรกลงในฐานข้อมูล แต่เมื่อตรวจสอบเพิ่มเติมฉันพบว่า 'เห็นได้ชัดว่า' ไม่มีโชคเช่นนั้น :) อย่างไรก็ตาม ทุกอย่างสมเหตุสมผลและขอบคุณอีกครั้ง
Joe Buckle

@ JoeBuckle มันแปลก คุณไม่ควรมีresend activationลิงค์ในการติดตั้งวานิลลา คุณมีปลั๊กอินที่ติดตั้งไว้แล้วหรือยัง? BuddyPress ยังมาพร้อมกับฟังก์ชั่นการเปิดใช้งานของผู้ใช้นอกกรอบ
s1lv3r

@ s1lv3r มีความเกี่ยวข้องกับ Theme-My-Login หรือไม่?
Joe Buckle

1

สองตัวเลือกให้เลือก:

  1. ใช้ปลั๊กอินเช่นอีเมลยืนยันการใช้งานผู้ใช้หรือผู้ใช้ใหม่อนุมัติ

  2. รหัสนี้ด้วยตัวคุณเอง

ฟังก์ชั่นบางอย่างที่คุณควรเริ่มต้น:

  • wp_mail ()เพื่อส่งอีเมล
  • add_user_meta ()เพื่อบันทึกรหัสเปิดใช้งานสำหรับผู้ใช้
  • สร้างลิงค์ที่มีรหัสและวางไว้ในอีเมลสร้างหน้าใน wordpress ซึ่งจับคีย์ - พารามิเตอร์ของคุณ (ตัวอย่างเช่นการใช้add_shortcode () )
  • ใช้get_user_meta ()เพื่อตรวจสอบรหัสการเปิดใช้งานกับรหัสที่เก็บไว้ใน db ให้วางเมตาคีย์ของผู้ใช้รายอื่นเพื่อทำเครื่องหมายผู้ใช้นี้ว่าเปิดใช้งานหากสำเร็จ
  • เพิ่มฟังก์ชั่นในการรับรองความถูกต้องตัวกรองเพื่อป้องกันผู้ใช้ที่ไม่ได้เปิดใช้งานจากการเข้าสู่ระบบ

0

คุณสามารถรับ user_id โดยทำสิ่งนี้ในขณะที่รับรองความถูกต้อง:

$username='user email provided by the user at login panel.';
$results = $wpdb->get_row( "SELECT ID FROM wp_users WHERE user_email='".$username."'");
   $activation_id = $results->ID;
   $activation_key =  get_user_meta( $activation_id, 'has_to_be_activated', true );
 if($activation_key != false )
 {
  echo '<h4 class="error">Your account has not been activated yet.<br /> To activate it check your email and clik on the activation link.</h4>';
 }
else{
//authenticate your user login here...
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.