Nếu người dùng hiện tại là quản trị viên hoặc biên tập viên


101

Làm cách nào để kiểm tra xem người dùng đăng nhập hiện tại là quản trị viên hay biên tập viên?

Tôi biết cách làm từng việc riêng lẻ:

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

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

Nhưng làm thế nào để tôi làm việc cùng nhau? Tức là người dùng là quản trị viên hay biên tập viên?


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

Câu trả lời:


190

Câu trả lời đầu tiên, không liên quan đến WordPress vì đây chỉ là PHP: Sử dụng toán tử "HOẶC" logic:

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

Nếu bạn muốn kiểm tra nhiều hơn hai vai trò, bạn có thể kiểm tra xem vai trò của người dùng hiện tại có nằm trong một loạt các vai trò hay không, đại loại như:

$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 } ?>

Tuy nhiên, current_user_cancó thể được sử dụng không chỉ với tên vai trò của người dùng mà còn với các khả năng.

Vì vậy, một khi cả biên tập viên và quản trị viên đều có thể chỉnh sửa trang, cuộc sống của bạn có thể dễ dàng kiểm tra các khả năng đó hơn:

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

Có một cái nhìn ở đây để biết thêm thông tin về khả năng.


1
bạn cần kiểm tra nếu is_logged_in();?
RobBenz

3
@RobBenz không, trong mọi trường hợp. Bởi vì current_user_can()luôn trả về false nếu người dùng không đăng nhập và wp_get_current_user()sẽ trả về người dùng mà không có bất kỳ vai trò nào nếu người dùng không đăng nhập, vì vậy array_intersect()sẽ luôn là sai.
gmazzap

1
Trong PHPDoc của current_user_can()hàm, chúng ta có thể thấy dòng " Trong khi kiểm tra các vai trò cụ thể thay cho khả năng được hỗ trợ một phần, thực tế này không được khuyến khích vì nó có thể tạo ra kết quả không đáng tin cậy ". Vì vậy, tôi nghĩ sẽ tốt hơn nếu tránh sử dụng vai trò trong khi kiểm tra khả năng của người dùng :-)
Erenor Paz

Khi tôi sử dụng array_intersectphương thức này, tôi nhận được một cảnh báo PHP trong nhật ký lỗi máy chủ của chúng tôi array_intersect(): Argument #2 is not an array. Đây có phải là do người dùng đang kiểm tra chỉ có một Vai trò không?
Garconis

@Garconis bình thường nó phải là một mảng. Đối với một số lý do có vẻ như đối với bạn không phải là một mảng. array_intersect($allowed_roles, (array)$user->roles )sẽ làm việc không có vấn đề.
gmazzap

9

Đầu tiên, current_user_can()không nên được sử dụng để kiểm tra vai trò của người dùng - nó nên được sử dụng để kiểm tra xem người dùng có khả năng cụ thể không .

Thứ hai, thay vì quan tâm đến vai trò của người dùng mà thay vào đó tập trung vào các khả năng, bạn không phải bận tâm đến việc thực hiện những vấn đề như vấn đề được hỏi trong câu hỏi ban đầu (đó là kiểm tra xem người dùng có phải là quản trị viên HOẶC biên tập viên không). Thay vào đó, nếu current_user_can()được sử dụng như dự định, đó là để kiểm tra khả năng của người dùng, chứ không phải vai trò của họ, bạn sẽ không cần kiểm tra có điều kiện để chứa bài kiểm tra "hoặc" (||). Ví dụ:

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

edit_pages là khả năng của cả vai trò quản trị viên và biên tập viên, nhưng không có bất kỳ vai trò thấp hơn nào như tác giả. Đây là cách current_user_can()dự định được sử dụng.


Xin lưu ý : Các nhà phát triển WP cấp cao đồng ý với câu trả lời này. Bạn nên cố gắng tránh kiểm tra vai trò càng nhiều càng tốt, sử dụng capabilties. Tôi hiện đang làm việc trên một dự án có nhiều vai trò chỉ có giới hạn 'đọc'. Giải pháp duy nhất là kiểm tra vai trò cho tôi. Xin lỗi, tôi không thể tìm thấy liên kết, đó là một cuộc thảo luận mở trên WP Github.
Bjorn

Đây phải là câu trả lời được chấp nhận, IMO. current_user_canNói chung nên được sử dụng cho các khả năng, không phải vai trò.
Armstrongest

2

Như @butlerblog đã trả lời, bạn không nên sử dụng current_user_can để kiểm tra vai trò

Thông báo này được thêm vào cụ thể trong tài liệu PHP về has_capchức năng được gọi bởicurrent_user_can

Mặc dù việc kiểm tra vai trò thay cho khả năng được hỗ trợ một phần, thực tế này không được khuyến khích vì nó có thể tạo ra kết quả không đáng tin cậy.

Cách ĐÚNG để làm điều này là để có được người dùng và kiểm tra $user->roles, như thế này:

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

Đây là một số chức năng trợ giúp tôi sử dụng để làm điều này (vì đôi khi tôi không chỉ muốn người dùng hiện tại):

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

Sau đó, bạn có thể làm điều này:

current_user_has_role( 'editor' );

hoặc là

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
Sẽ thật tuyệt nếu bạn có thể giải thích như thế nào nó giúp OP.
bravokeyl

Bạn chỉ có thể cho phép xem trang "trình chỉnh sửa" hoặc "thành viên" mà bạn có thể đăng mã này trực tiếp trong generic-page.php
seowmx

4
Xin đừng bỏ mã. Thêm ý kiến ​​và một số giải thích làm thế nào điều này giải quyết vấn đề người hỏi.
kraftner
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.