사용자 역할이 자신의 수준보다 낮은 역할로 새 사용자를 만들도록 허용하는 방법은 무엇입니까?


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. 안내 원- Guest역할 사용자 만들 수 있어야합니다
  4. 리뷰 - 허용되지 않음 사용자를 만들 수 있습니다.

어떻게 할 수 있습니까? 플러그인을 사용하지 않고 이것을 달성 할 수 있다면 더 좋습니다.

답변:


23

먼저 Doctorand ( Receptionist역할)에 다음 기능을 추가해야합니다 .

  • list_users
  • edit_users
  • create_users
  • delete_users

이제 우리는 그들이 생성 / 편집 / 삭제할 수 있는 사용자 를 제어 하는 작업을 할 수 있습니다. 사용자가 편집 할 수있는 역할을 반환하는 "도우미"기능으로 시작하겠습니다.

/**
 * 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 .. 거기 있습니까? 나는 당신의 대답을 upvoted했습니다. U PLZ 내 위의 의견을 살펴볼 수 있습니까 ??
Riffaz Starr

내 개정판을 확인하십시오.
TheDeadMedic

@TheDeadMedic 귀하의 코드는 저에게 많은 도움이되었습니다. 하나의 문제가 있습니다. 나는 이것을 다중 사이트에서 사용합니다. 이 코드가 내 문제를 해결하는 동안 다른 문제가 발생했습니다. 최고 관리자로 로그인하면 최고 관리자의 네트워크 페이지에서 역할을 전혀 선택할 수 없습니다. 이 문제를 어떻게 해결합니까?
jockebq

1
이 질문에 대한 훌륭한 답변입니다. 문법 오류로 가득 찬이 영역에서 Wordpress의 자체 문서가 완전히 부족하다는 것을 알았습니다. 이것은 문제에 대한 정말 효율적인 솔루션입니다.
벤지

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

대부분의 경우 역할의 경우는 소문자 여야합니다. 위의 예에서 슬러그와 이름은 제목 케이스를 사용하여 제공되므로 권장하지는 않지만 기술적으로 정확합니다.
벤지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.