แยกการลงทะเบียนและเข้าสู่ระบบสำหรับบทบาทที่แตกต่าง


17

ฉันตั้งค่าบทบาทใหม่ 2 รายการสำหรับไซต์ของฉันโดยใช้ปลั๊กอิน "สมาชิก" - "ผู้ขาย" และ "ผู้ซื้อ"

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

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

ปลั๊กอินเช่นนี้มีอยู่หรือไม่? และถ้าไม่ใช่จะทำอย่างไรได้?


1
คุณไม่จำเป็นต้องใช้แบบฟอร์มแยกกันเพียงแค่แบบฟอร์มลงทะเบียนเดียวที่มีวิธีการเลือกบทบาท เมื่อพวกเขาลงทะเบียนกับบทบาทแล้วทุกคนสามารถใช้หน้าเข้าสู่ระบบเดียวกันได้ หากมีคนลงทะเบียนในฐานะผู้ซื้อจะไม่มีวิธีใดที่พวกเขาจะสามารถลงชื่อเข้าใช้เป็นผู้อื่นได้ยกเว้นผู้ซื้อที่มีข้อมูลประจำตัวของพวกเขา บางทีสิ่งนี้จะชี้ให้คุณไปในทิศทางที่ถูกต้อง
Milo

คุณสามารถใช้ลิงก์นี้wordpress.stackexchange.com/questions/237248/…
ชาร์ลส์ซาเวียร์

คำตอบ:


17

การสร้างการลงทะเบียนสองครั้งแยกกันสำหรับบทบาทที่แตกต่างนั้นเป็นเรื่องง่าย:

//create a hidden field for role
add_action('register_form','add_hidden_role_field');

function add_hidden_role_field(){
    if (isset($_GET['role'])){
        echo '<input id="user_email" type="hidden" tabindex="20" size="25" value="'.$_GET['role'].'" name="role"/>';
    }
}

add_action('user_register', 'update_role');

//save the the role
function update_role($user_id, $password="", $meta=array()) {
   if (isset($_POST['role'])){
       $userdata = array();
       $userdata['ID'] = $user_id;
       $userdata['role'] = $_POST['role'];

       //only allow if user role is my_role to avoid a few new admins to the site
       if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
          wp_update_user($userdata);
       }
   }
}

และตอนนี้คุณสามารถเชื่อมโยงแต่ละบทบาทกับแบบฟอร์มการลงทะเบียน "ของตัวเอง":

seller: http://example.com/wp-login.php?action=register&role=seller
buyer: http://example.com/wp-login.php?action=register&role=buyer

แต่ดังที่ไมโลให้ความเห็น:

"ถ้ามีคนลงทะเบียนในฐานะผู้ซื้อไม่มีวิธีใดที่พวกเขาจะสามารถลงชื่อเข้าใช้เป็นอะไรก็ได้ยกเว้นผู้ซื้อที่มีข้อมูลประจำตัวของพวกเขา"

ซึ่งหมายความว่าพวกเขาจะต้องใช้อีเมลอื่นเพื่อลงทะเบียนบทบาทอื่น

ปรับปรุง

นี่คือการอัปเดตพร้อมตัวอย่างเพื่อแสดงวิธีที่คุณสามารถใช้หน้าเดียวกัน แต่มีฟิลด์ต่าง ๆ สำหรับแต่ละบทบาท

ดังนั้นคุณต้องเปลี่ยนฟังก์ชั่นเล็กน้อย:

//create a hidden field for role and extra fields needed
add_action('register_form','add_hidden_role_field');

function add_hidden_role_field(){
    if (isset($_GET['role'])){
        $user_type = $_GET['role'];
        echo '<input id="user_email" type="hidden" tabindex="20" size="25" value="'.$_GET['role'].'" name="role"/>';
    }
    if (isset($user_type) && $user_type == "seller"){
        //add extra seller fields here eg:
        ?>
        business name:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="business_name"/>

        business address:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="business_address"/>
        <?php
    }
    if (isset($user_type) && $user_type == "buyer"){
        //add extra buyer fields here eg:
        ?>
        buyer name:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="buyer_name"/>
        <?php
    }
}

วิธีนี้จะแสดงเฉพาะฟิลด์ที่จำเป็นสำหรับบทบาทที่ระบุ

ถัดไปคือถ้าคุณต้องการให้มีการตรวจสอบบางอย่างกับเขตข้อมูลพิเศษเหล่านี้คุณสามารถใช้register_posthook ตัวอย่างเช่น:

add_action('register_post','my_user_fields_validation',10,3);

function my_user_fields_validation($login, $email, $errors) {
    global $firstname, $lastname;
    //get the role to check
    if (isset($_POST['role'])){
        $user_type = $_POST['role'];
    }
    //check the fields according to the role
    if (isset($user_type) && $user_type == "seller"){
    //check sellers fields
        if ($_POST['business_name'] == '') {
            $errors->add('empty_business_name', "<strong>ERROR</strong>: Please Enter in a Business name");
        }
        if ($_POST['business_address'] == '') {
            $errors->add('empty_business_address', "<strong>ERROR</strong>: Please Enter in Business address");
        } 
    }
    if (isset($user_type) && $user_type == "buyer"){
        //check buyers fields
        if ($_POST['buyer_name'] == '') {
            $errors->add('empty_buyer_name', "<strong>ERROR</strong>: Please Enter in a Buyer name");
        }
    }
}

ถ้าทุกอย่างเรียบร้อยดีให้บันทึกเขตข้อมูลในเมตาของผู้ใช้ตามบทบาท

add_action('user_register', 'update_role');

//save the role
function update_role($user_id, $password="", $meta=array()) {
   if (isset($_POST['role'])){
       $userdata = array();
       $userdata['ID'] = $user_id;
       $userdata['role'] = $_POST['role'];
        $user_type = $_POST['role'];
       //only allow if user role is my_role to avoid a few new admins to the site
        if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
            wp_update_user($userdata);
        }
        if (isset($user_type) && $user_type == "seller"){
            //save sellers fields
            update_user_meta($user_id, 'business_name', $_POST['business_name']);
            update_user_meta($user_id, 'business_address', $_POST['business_address']);
        }
        if (isset($user_type) && $user_type == "buyer"){
            //save sellers fields
            update_user_meta($user_id, 'buyer_name', $_POST['buyer_name']);
        }
   }
}

ขอบคุณ Bainternet & Milo! ใช่ฉันหมายถึงผู้เข้าชมจะลงทะเบียนสองครั้ง - หนึ่งครั้งในฐานะผู้ขายและอีกคนหนึ่งในฐานะผู้ซื้อด้วยอีเมลที่แตกต่างกัน แต่ฉันต้องการแบบฟอร์มการลงทะเบียนสองแบบแยกกันเนื่องจากแต่ละแบบจะมีฟิลด์ต่างกัน ตัวอย่างเช่น: แบบฟอร์มการลงทะเบียนของผู้ขายจะรวมฟิลด์ - "ชื่อธุรกิจ" และ "ที่อยู่ธุรกิจ" ในขณะที่แบบฟอร์มการลงทะเบียนของผู้ซื้อจะรวมฟิลด์ "ชื่อผู้ซื้อ" ไว้ด้วย ดังนั้น Bainternet ฉันไม่แน่ใจว่าฉันสามารถใช้รหัสของคุณได้เหมือนเดิม (แต่ขอบคุณมากสำหรับความพยายาม) เนื่องจากมันชี้ไปที่หน้าเดียวกันกับพารามิเตอร์ที่แตกต่างกันเท่านั้น ฉันจะทำอย่างไรกับสองแบบแยกกัน?
Ash

@Ash: คุณยังไม่จำเป็นต้องใช้สองฟอร์มแยกกันเพียงเพิ่มฟิลด์ตามบทบาทฉันจะอัปเดตคำตอบด้วยตัวอย่าง
Bainternet

@Ash: ตรวจสอบการอัปเดตในคำตอบ
Bainternet

@Bainternet ขอบคุณมากสำหรับรหัสเพิ่มเติม!
Ash

@Bainternet: ขออภัยสำหรับคำถาม newbie แต่นั่นคือสิ่งที่ฉัน :-) - เป็นรหัสนี้ใช้งานได้เฉพาะในปลั๊กอินหรือสามารถใช้ในไฟล์ php ซึ่งเป็นแม่แบบสำหรับหน้า?
Ash
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.