현재 사용자가 관리자 또는 편집자 인 경우


101

현재 로그인 한 사용자가 관리자인지 편집자인지 확인하려면 어떻게해야합니까?

각각 개별적으로 수행하는 방법을 알고 있습니다.

<?php if(current_user_can('editor')) { ?> 
    <!-- Stuff here for editors -->
<?php } ?>

<?php if(current_user_can('administrator')) { ?>
    <!-- Stuff here for administrators -->
<?php } ?>

그러나 어떻게 그것들을 함께 작동합니까? 즉, 사용자가 관리자 또는 편집자입니까?


10
if( current_user_can('editor') || current_user_can('administrator') )
Shazzad

답변:


190

첫 번째 대답은 단지 PHP 일 뿐이므로 WordPress와 관련이 없습니다. 논리 "OR"연산자를 사용하십시오.

<?php if( current_user_can('editor') || current_user_can('administrator') ) {  ?>
    // Stuff here for administrators or editors
<?php } ?>

둘 이상의 역할을 확인하려는 경우 현재 사용자의 역할이 다음과 같은 역할 배열 내에 있는지 확인할 수 있습니다.

$user = wp_get_current_user();
$allowed_roles = array('editor', 'administrator', 'author');
<?php if( array_intersect($allowed_roles, $user->roles ) ) {  ?>
   // Stuff here for allowed roles
<?php } ?>

그러나 current_user_can사용자의 역할 이름뿐만 아니라 기능과도 함께 사용할 수 있습니다.

따라서 편집자와 관리자가 페이지를 편집 할 수있게되면 이러한 기능을 쉽게 확인할 수 있습니다.

<?php if( current_user_can('edit_others_pages') ) {  ?>
    // Stuff here for user roles that can edit pages: editors and administrators
<?php } ?>

봐 가지고 여기에 기능에 대한 자세한 내용입니다.


당신은 확인해야 is_logged_in();합니까?
RobBenz

3
@RobBenz 아니오, 어떤 경우에도. 때문에 current_user_can()항상 사용자가 로그인되지 않으며, 경우에 false를 돌려 wp_get_current_user()사용자가 로그인하지 않은 경우 어떤 역할없이 사용자를 반환합니다, 그래서는 array_intersect()항상 false가 될 것입니다.
gmazzap

1
current_user_can()함수 의 PHPDoc에서 " 기능 대신 특정 역할을 검사하는 것이 부분적으로 지원되지만 신뢰할 수없는 결과를 생성 할 수 있으므로이 방법은 권장하지 않습니다 "라는 행 을 볼 수 있습니다 . 따라서 사용자의 기능을 확인하면서 역할을 사용하지 않는 것이 좋습니다. :-)
Erenor Paz

array_intersect방법을 사용할 때 서버 오류 로그에라는 PHP 경고가 표시됩니다 array_intersect(): Argument #2 is not an array. 확인중인 사용자가 하나의 역할 만 가지고 있기 때문입니까?
Garconis

@ Gaconis는 일반적으로 배열이어야합니다. 어떤 이유로 든 배열이 아닌 것 같습니다. array_intersect($allowed_roles, (array)$user->roles )문제없이 작동합니다.
gmazzap

9

첫째, current_user_can()사용자의 역할을 확인하는 데 사용해서는 안됩니다. 사용자에게 특정 기능 이 있는지 확인하는 데 사용해야합니다 .

둘째, 사용자의 역할에 관심을두기보다는 기능에 중점을 두는 대신 원래 질문에서 사용자가 관리자인지 편집자인지 확인하는 문제와 같은 작업을 수행 할 필요가 없습니다. 대신 current_user_can()의도 된대로 사용되었는데, 사용자의 역할이 아닌 사용자의 기능을 검사하기 위해 "또는"(||) 테스트를 포함하기위한 조건부 검사가 필요하지 않습니다. 예를 들면 다음과 같습니다.

if ( current_user_can( 'edit_pages' ) ) { ...

edit_pages는 관리자 및 편집자 역할을 모두 수행 할 수 있지만 작성자와 같은 하위 역할은 아닙니다. 이것이 current_user_can()의도 된 방법 입니다.


참고 : 고급 WP 개발자는이 답변에 동의합니다. 가능한 한 역할 검사를 피하려면 기능을 사용하십시오. 나는 현재 '읽기'만있는 여러 역할을 가진 프로젝트를 진행하고 있습니다. 유일한 해결책은 역할 확인입니다. 죄송합니다. 링크를 찾을 수 없습니다. WP Github에 대한 공개 토론이었습니다.
Bjorn

이것이 정답입니다, IMO. current_user_can일반적으로 역할이 아닌 기능에 사용해야합니다.
암스트롱

2

@butlerblog의 답변에서 언급했듯이 current_user_can을 사용하여 역할을 확인해서는 안됩니다.

이 공지는 PHP has_cap함수에서 호출 한 함수 에 특별히 추가되었습니다.current_user_can

기능 대신 역할에 대한 검사가 부분적으로 지원되지만 신뢰할 수없는 결과를 생성 할 수 있으므로이 방법은 권장하지 않습니다.

이를 수행하는 올바른 방법은 사용자를 가져 와서 다음과 같이 확인하는 $user->roles것입니다.

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ) {

        $user = get_userdata( get_current_user_id() );
        if( ! $user || ! $user->roles ){
            return false;
        }

        if( is_array( $role ) ){
            return array_intersect( $role, (array) $user->roles ) ? true : false;
        }

        return in_array( $role, (array) $user->roles );
    }
}

이 작업을 수행하는 데 사용되는 도우미 기능이 있습니다 (때로는 현재 사용자를 원하지 않음).

if( ! function_exists( 'current_user_has_role' ) ){
    function current_user_has_role( $role ){
        return user_has_role_by_user_id( get_current_user_id(), $role );
    }
}

if( ! function_exists( 'get_user_roles_by_user_id' ) ){
    function get_user_roles_by_user_id( $user_id ) {
        $user = get_userdata( $user_id );
        return empty( $user ) ? array() : $user->roles;
    }
}

if( ! function_exists( 'user_has_role_by_user_id' ) ){
    function user_has_role_by_user_id( $user_id, $role ) {

        $user_roles = get_user_roles_by_user_id( $user_id );

        if( is_array( $role ) ){
            return array_intersect( $role, $user_roles ) ? true : false;
        }

        return in_array( $role, $user_roles );
    }
}

그럼 당신은 이것을 할 수 있습니다 :

current_user_has_role( 'editor' );

또는

current_user_has_role( array( 'editor', 'administrator' ) );


-1
<?php if( current_user_can('editor')) :
  echo "welcome";
elseif( current_user_can('member')) :
  echo "welcome";
else :
 wp_die("<h2>To view this page you must first <a href='". wp_login_url(get_permalink()) ."' title='Login'>log in</a></h2>");
endif;
?>

1
OP에 어떻게 도움이되는지 설명 할 수 있다면 좋을 것입니다.
bravokeyl

"편집자"또는 "회원"만 볼 수 있습니다.이 코드를 generic-page.php에 직접 게시 할 수 있습니다.
seowmx

4
코드를 삭제하지 마십시오. 요청자 문제를 해결하는 방법에 대한 설명과 설명을 추가하십시오.
kraftner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.