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


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.