Làm cách nào để cho phép vai trò người dùng tạo người dùng mới dưới vai trò chỉ thấp hơn cấp độ của anh ta?


14

Tôi có ba vai trò bổ sung trong trang web của tôi.

  1. Bác sĩ
  2. Lễ tân
  3. Khách mời

những vai trò này được thêm vào bằng mã sau đây:

* 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'));

Theo mặc định Administratorvai trò tạo tất cả các vai trò khác. Nhưng tôi muốn giới hạn vai trò gán này theo cấp độ người dùng. Ý của tôi là:

  1. Quản trị viên - có thể tạo tất cả người dùng vai trò - có thể theo mặc định.
  2. Doctor - sẽ có thể tạo ReceptionistGuestvai trò người sử dụng CHỈ
  3. Nhân viên lễ tân - sẽ có thể tạo ra Guestvai trò người sử dụng CHỈ
  4. Khách - Không được phép tạo bất kỳ người dùng.

Làm thế nào có thể làm điều này? Tốt hơn nếu tôi có thể đạt được điều này mà không cần sử dụng bất kỳ plugin nào.

Câu trả lời:


23

Trước tiên, bạn cần thêm các khả năng sau đây cho vai trò DoctorReceptionistvai trò:

  • list_users
  • edit_users
  • create_users
  • delete_users

Bây giờ chúng ta có thể có được để làm việc với các điều khiển người sử dụng có thể tạo / edite / xóa. Hãy bắt đầu với chức năng "người trợ giúp" sẽ trả về vai trò nào mà người dùng được phép chỉnh sửa:

/**
 * 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;
}

Và để đặt vai trò nào họ có thể chỉ định người dùng:

/**
 * 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' );

Và cuối cùng, giới hạn người dùng nào họ có thể chỉnh sửa / xóa dựa trên vai trò của họ:

/**
 * 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 );

Hoàn hảo cảm ơn rất nhiều .. Sau khi tôi thêm các khả năng và mã của bạn, nó hoạt động như chúng tôi mong đợi. Nhưng Doctors, ReceptionistGuestkhông thể chỉnh sửa hồ sơ của riêng họ quá. Tôi muốn họ chỉnh sửa hồ sơ của riêng họ. Làm thế nào tôi có thể làm điều đó?
Riffaz Starr

chào TheDeadMedic .. Bạn có ở đó không? Tôi đã nâng cao câu trả lời của bạn. bạn có thể nhìn vào nhận xét trên của tôi không ??
Riffaz Starr

Kiểm tra sửa đổi của tôi.
TheDeadMedic

@TheDeadMedic Mã của bạn đã giúp tôi rất nhiều. Tôi chỉ có một rắc rối. Tôi sử dụng cái này trên Multisite. Và trong khi mã này giải quyết vấn đề của tôi, nó đã tạo ra một mã khác. Khi đăng nhập với tư cách Quản trị viên Siêu cấp, tôi không thể chọn bất kỳ vai trò nào từ Trang Mạng của Quản trị viên Siêu. Tôi giải quyết điều này như thế nào?
jockebq

1
Đây là một câu trả lời tuyệt vời cho câu hỏi. Tôi thấy tài liệu riêng của Wordpress hoàn toàn thiếu trong lĩnh vực này, thậm chí còn đầy lỗi ngữ pháp. Đây là một giải pháp thực sự hiệu quả cho vấn đề.
Benji

0

Các câu trả lời trên đã làm việc tuyệt vời. Tuy nhiên, các vai trò cần phải viết thường

function wpse_188863_get_allowed_roles( $user ) { }

Ví dụ:

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';
}

Trường hợp của các vai trò có thể là chữ thường trong hầu hết các trường hợp. Trong ví dụ trên, cả sên và tên đều được đưa ra bằng cách sử dụng trường hợp tiêu đề, vì vậy điều này đúng về mặt kỹ thuật, mặc dù không được khuyến nghị.
Benji
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.