Làm thế nào để kiểm tra nếu người dùng có vai trò cụ thể?


59

Tôi có một yêu cầu khá cụ thể để hiển thị văn bản khác trong nhãn trường trên trang hồ sơ người dùng dựa trên vai trò của người dùng hiện tại. Tôi dường như không thể tìm ra cách kiểm tra xem liệu sử dụng hiện tại có phải là một "tác giả" hay không.

Tôi đang tìm kiếm một chức năng như:

is_user_in_role($user, "author");

Tôi tưởng tượng điều này khá đơn giản, nhưng tôi đã tìm kiếm quá lâu mà không có câu trả lời nên tôi nghĩ tôi sẽ đăng nó ở đây.

Câu trả lời:


113

Nếu bạn chỉ cần điều này cho người dùng hiện tại current_user_can()chấp nhận cả vai trò và khả năng.

CẬP NHẬT : Truyền tên vai trò đến current_user_can()không còn được đảm bảo để hoạt động chính xác (xem # 22624 ). Thay vào đó, bạn có thể muốn kiểm tra vai trò của người dùng:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}

10
Tôi biết bài đăng này đã được trả lời từ lâu nhưng nếu ai đó tình cờ đến đây ... hãy xem tài liệu một lần nữa cho current_user_can () -> "Đừng chuyển tên vai trò cho current_user_can (), vì điều này không được đảm bảo hoạt động chính xác (xem # 22624). Thay vào đó, bạn có thể muốn thử chức năng kiểm tra vai trò người dùng được đặt bởi AppTheme. " ( codex.wordpress.org/Function_Reference/civerse_user_can )
bestprogrammerintheworld

1
^ Có một dấu ngoặc bị thiếu trong câu lệnh if
Aajahid

1
@Aajahid đã chỉnh sửa :)
Rarst

10

Tôi đang tìm cách để có được vai trò của người dùng bằng cách sử dụng id của người dùng. Đây là những gì tôi đã đưa ra:

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

Sau đó, một is_user_in_role()chức năng có thể được thực hiện như vậy:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}

1
hoạt động tốt đối với tôi để có được vai trò đầu tiên được gán cho người dùng.
Q Studio

Điều gì về tất cả các vai trò được giao cho người dùng?
Vishal Kumar Sahu

1
@Vishal Kumar điều này sẽ kiểm tra đối với tất cả các vai trò được gán cho người dùng.
Stephen M. Harris

Chức năng này không tồn tại, không chắc là nó đã cũ hay chưa, nhưng bạn nên sử dụng câu trả lời ở trên hoặc câu tôi đã đăng bên dưới
sMstyle

2

Bạn cũng có thể chỉ cần tạo một đối tượng người dùng mới:

$user = new WP_User( $user_id );

if ( ! empty( $user->roles ) && is_array( $user->roles ) && in_array( 'Some_role', $user->roles ) ) {
    return true;
}

Không chắc chắn phiên bản nào get_user_roles_by_user_idđã bị xóa, nhưng nó không còn là một chức năng có sẵn.


Điều này rất hữu ích khi tôi phải gọi các phương thức khác của lớp WP_User.
Justin Waulters

0

Đây là một chức năng chấp nhận người dùng và vai trò để linh hoạt hơn:

chức năng my_has_role ($ user, $ vai trò) {
  $ vai trò = $ người dùng-> vai trò; 
  return in_array ($ vai trò, (mảng) $ user-> vai trò);
}

if (my_has_role ($ user, 'some_role')) {
  // làm công cụ
}

0

Các vai trò gọi trên Đối tượng người dùng $user->roleskhông trả về tất cả các vai trò. Cách chính xác để tìm xem người dùng có vai trò hoặc khả năng đang theo dõi. (Điều này hoạt động trong phiên bản wp 2.0.0 trở lên.) Hàm sau hoạt động với id người dùng, bạn có thể lấy id người dùng hiện tại bằng cách$current_user_id = get_current_user_id();

/**
 * Returns true if a user_id has a given role or capability
 * 
 * @param int $user_id
 * @param string $role_or_cap Role or Capability
 * 
 * @return boolean
 */
function my_has_role($user_id, $role_or_cap) {

    $u = new \WP_User( $user_id );
    //$u->roles Wrong way to do it as in the accepted answer.
    $roles_and_caps = $u->get_role_caps(); //Correct way to do it as wp do multiple checks to fetch all roles

    if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true ) 
       {
           return true;
       }
 }
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.