Làm thế nào để có được vai trò của người dùng


15

Tôi cần có được vai trò liên quan đến người dùng - không phải là "người dùng hiện đang đăng nhập".

Tôi đang sử dụng Buddypress (không quan trọng với bản chất của câu hỏi này) và tôi đang ở trong bp_members()vòng lặp.

Làm cách nào tôi có thể truy xuất vai trò của người dùng mà tôi đang báo cáo trong vòng lặp tại bất kỳ thời điểm nào?

Cảm ơn.

Câu trả lời:


17

Sử dụng ID người dùng và WP_User :

$user = new WP_User( $user_id );
print wp_sprintf_l( '%l', $user->roles );

Cập nhật

/**
 * Get user roles by user ID.
 *
 * @param  int $id
 * @return array
 */
function wpse_58916_user_roles_by_id( $id )
{
    $user = new WP_User( $id );

    if ( empty ( $user->roles ) or ! is_array( $user->roles ) )
        return array ();

    $wp_roles = new WP_Roles;
    $names    = $wp_roles->get_names();
    $out      = array ();

    foreach ( $user->roles as $role )
    {
        if ( isset ( $names[ $role ] ) )
            $out[ $role ] = $names[ $role ];
    }

    return $out;
}

Ví dụ sử dụng:

print '<pre>' 
    . htmlspecialchars( 
        print_r( wpse_58916_user_roles_by_id(1), TRUE ) 
        ) 
    . '</pre>';

Array
(
    [administrator] => Administrator
)

Cảm ơn @toscho - dường như nó không mang lại cho tôi những gì tôi đang mong đợi. Tôi có một trình soạn thảo, giá trị trống / null và bbp_partIDIAant. Tôi đã mong đợi để xem Quản trị viên, Biên tập viên, Tác giả hoặc Người đăng ký vì đó là những vai trò duy nhất chúng tôi đang sử dụng.
thẳng thắn13

@ frank13 Xem cập nhật của tôi.
fuxia

2
Cảm ơn @toscho ... đó là rất nhiều mã để có được giá trị dữ liệu mà tôi nghĩ sẽ có sẵn hơn.
thẳng thắn13

Rất hữu ích, cảm ơn! Thật đáng buồn và khó hiểu, tại sao bạn không thể truy cập trực tiếp hơn vào vai trò của người dùng. Hàm "can user" hoạt động ngược lại với những gì hầu hết mọi người mong muốn.
Mike

7

Nếu bp_memberstrả về một mảng các WP_Userđối tượng, mỗi đối tượng sẽ có một thuộc tính roleschứa một mảng các vai trò của người dùng.

Mặt khác, bạn có thể sử dụng get_user_metacho khóa wp_capabilities, nó sẽ trả về một loạt các role => capabilitycặp:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);

$ vai trò kết thúc là một mảng. Tôi đang tìm kiếm để có được $user->IDvai trò của. Chỉ có một vai trò là không có người dùng nào trong hệ thống của chúng tôi được chỉ định nhiều hơn 1 vai trò.
thẳng thắn13

$roles[0], làm xong.
chrisguitarguy

Ok, cảm ơn @ChristopherDavis ... $ vai trò [0] trả về "0" trên bảng cho mọi người dùng trong danh sách
thẳng thắn

@chrisguitarguy $ vai trò [0] vẫn hoạt động?
T.Todua

0

Theo tôi hiểu, nó có thể đã thay đổi qua nhiều năm, nhưng bây giờ thì không 'wp_capabilities'. Tôi đã xem xét các tệp WP cốt lõi, cách chúng thực hiện bây giờ và tìm ra giải pháp mới cho vấn đề này. Đây là mã tôi sử dụng bây giờ:

global $wpdb;
$cap = get_user_meta( $wp_user_id, $wpdb->get_blog_prefix() . 'capabilities', true );

$cap sau đó đến như một mảng kết hợp, ví dụ:

{
    "administrator": true
}

hoặc là

{
    "subscriber": true
}

Vì vậy, trong trường hợp của bạn, có lẽ bạn nên lấy các khóa của mảng:

$caps_array = array_keys( $cap );

và sau đó nhận được mọi thứ từ nó. Tôi cần xem người dùng có vai trò quản trị viên hay không, vì vậy tôi đã kiểm tra:

if ( is_array( $cap ) && !empty( $cap['administrator'] ) ) { return true; }

Tôi đã có một ID người dùng, không phải toàn bộ WP_Userđối tượng và tôi không muốn sử dụng bất kỳ giải pháp nào sẽ tạo ra userđối tượng. Khi tôi đã kiểm tra, hãy get_user_metađi thẳng tới db để kiểm tra tham số chính xác này, vì vậy đây sẽ là con đường nhanh nhất và thông minh về tài nguyên.

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.