จะอนุญาตให้บทบาทผู้ใช้สร้างผู้ใช้ใหม่ภายใต้บทบาทที่ต่ำกว่าระดับของเขาเท่านั้นได้อย่างไร


14

ฉันมีสามบทบาทพิเศษในเว็บไซต์ของฉัน

  1. คุณหมอ
  2. พนักงานต้อนรับ
  3. แขก

บทบาทเหล่านั้นจะถูกเพิ่มโดยรหัสต่อไปนี้:

* adding Doctor role */
$doctor_role = add_role('Doctor', __('Doctor'), array('read'=>'true'));

/* adding Receptionist role */
$receptionist_role = add_role('Receptionist', __('Receptionist'), array('read'=>'true'));

/* adding Guest role */
$guest_role = add_role('Guest', __('Guest'), array('read'=>'true'));

โดยค่าเริ่มต้นAdministratorบทบาทสร้างบทบาทอื่น ๆ ทั้งหมด แต่ฉันต้องการ จำกัด บทบาทการมอบหมายนี้ตามระดับผู้ใช้ ที่ฉันหมายถึงคือ:

  1. ผู้ดูแลระบบ - ควรจะสามารถสร้างผู้ใช้ทุกคนได้โดยค่าเริ่มต้น
  2. หมอ - ควรจะสามารถสร้างReceptionistและกำหนดGuestบทบาทผู้ใช้ได้เท่านั้น
  3. Receptionist - ควรสร้างGuestผู้ใช้ที่มีบทบาทเท่านั้น
  4. แขก - ไม่อนุญาตให้สร้างผู้ใช้

ทำสิ่งนี้ได้อย่างไร ดีกว่าถ้าฉันสามารถทำได้โดยไม่ใช้ปลั๊กอินใด ๆ

คำตอบ:


23

ประการแรกคุณต้องเพิ่มความสามารถต่อไปนี้ลงในDoctorและReceptionistบทบาท:

  • list_users
  • edit_users
  • create_users
  • delete_users

ตอนนี้เราสามารถได้รับการทำงานที่มีการควบคุมซึ่งผู้ใช้พวกเขาสามารถสร้าง / Edite / ลบ เริ่มจากฟังก์ชั่น "ผู้ช่วย" ที่จะคืนค่าบทบาทที่อนุญาตให้ผู้ใช้แก้ไข:

/**
 * Helper function get getting roles that the user is allowed to create/edit/delete.
 *
 * @param   WP_User $user
 * @return  array
 */
function wpse_188863_get_allowed_roles( $user ) {
    $allowed = array();

    if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles
        $allowed = array_keys( $GLOBALS['wp_roles']->roles );
    } elseif ( in_array( 'Doctor', $user->roles ) ) {
        $allowed[] = 'Receptionist';
        $allowed[] = 'Guest';
    } elseif ( in_array( 'Receptionist', $user->roles ) ) {
        $allowed[] = 'Guest';
    }

    return $allowed;
}

และเพื่อกำหนดบทบาทที่พวกเขาสามารถกำหนดผู้ใช้:

/**
 * Remove roles that are not allowed for the current user role.
 */
function wpse_188863_editable_roles( $roles ) {
    if ( $user = wp_get_current_user() ) {
        $allowed = wpse_188863_get_allowed_roles( $user );

        foreach ( $roles as $role => $caps ) {
            if ( ! in_array( $role, $allowed ) )
                unset( $roles[ $role ] );
        }
    }

    return $roles;
}

add_filter( 'editable_roles', 'wpse_188863_editable_roles' );

และสุดท้าย จำกัด ผู้ใช้ที่พวกเขาสามารถแก้ไข / ลบตามบทบาทของพวกเขา:

/**
 * Prevent users deleting/editing users with a role outside their allowance.
 */
function wpse_188863_map_meta_cap( $caps, $cap, $user_ID, $args ) {
    if ( ( $cap === 'edit_user' || $cap === 'delete_user' ) && $args ) {
        $the_user = get_userdata( $user_ID ); // The user performing the task
        $user     = get_userdata( $args[0] ); // The user being edited/deleted

        if ( $the_user && $user && $the_user->ID != $user->ID /* User can always edit self */ ) {
            $allowed = wpse_188863_get_allowed_roles( $the_user );

            if ( array_diff( $user->roles, $allowed ) ) {
                // Target user has roles outside of our limits
                $caps[] = 'not_allowed';
            }
        }
    }

    return $caps;
}

add_filter( 'map_meta_cap', 'wpse_188863_map_meta_cap', 10, 4 );

ขอบคุณมาก .. หลังจากฉันเพิ่มความสามารถและโค้ดของคุณมันทำงานได้อย่างที่เราคาดไว้ แต่Doctors, ReceptionistและGuestไม่สามารถที่จะแก้ไขรายละเอียดของตัวเองมากเกินไป ฉันต้องการให้พวกเขาแก้ไขโปรไฟล์ของตัวเอง ฉันจะทำสิ่งนั้นได้อย่างไร
Riffaz Starr

สวัสดี TheDeadMedic .. คุณอยู่ที่นั่นหรือไม่ ฉันตอบคำถามแล้ว คุณสามารถดูความคิดเห็นข้างต้นของฉันได้ไหม?
Riffaz Starr

ตรวจสอบการแก้ไขของฉัน
TheDeadMedic

@TheDeadMedic รหัสของคุณช่วยฉันได้มาก ฉันมีเพียงปัญหาเดียว ฉันใช้สิ่งนี้กับ Multisite และในขณะที่รหัสนี้แก้ปัญหาของฉันมันก็สร้างอีกหนึ่ง เมื่อเข้าสู่ระบบในฐานะผู้ดูแลระบบขั้นสูงฉันไม่สามารถเลือกบทบาทได้เลยจากหน้าเครือข่ายของผู้ดูแลระบบขั้นสูง ฉันจะแก้ปัญหานี้ได้อย่างไร
jockebq

1
นี่คือคำตอบที่ยอดเยี่ยมสำหรับคำถาม ฉันพบเอกสารของ Wordpress ทั้งหมดที่ขาดในพื้นที่นี้แม้เต็มไปด้วยข้อผิดพลาดทางไวยากรณ์ นี่เป็นวิธีแก้ไขปัญหาที่มีประสิทธิภาพจริงๆ
Benji

0

คำตอบข้างต้นใช้งานได้ดี อย่างไรก็ตามบทบาทจะต้องเป็นตัวพิมพ์เล็กสำหรับ

function wpse_188863_get_allowed_roles( $user ) { }

ตัวอย่างเช่น

if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles
    $allowed = array_keys( $GLOBALS['wp_roles']->roles );
} elseif ( in_array( 'doctor', $user->roles ) ) {
    $allowed[] = 'receptionist';
    $allowed[] = 'guest';
} elseif ( in_array( 'receptionist', $user->roles ) ) {
    $allowed[] = 'guest';
}

กรณีของบทบาทควรเป็นตัวพิมพ์เล็กในเกือบทุกกรณี ในตัวอย่างด้านบนทั้งกระสุนและชื่อถูกกำหนดโดยใช้หัวเรื่องตัวพิมพ์ดังนั้นจึงถูกต้องทางเทคนิคแม้ว่าจะไม่แนะนำก็ตาม
Benji
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.