Como obter papel do usuário

15

Preciso obter a função associada a um usuário - não o "usuário conectado no momento".

Estou usando o Buddypress (não importa a natureza desta pergunta) e estou no bp_members()circuito.

Como recuperar o papel do usuário no qual estou relatando no loop a qualquer momento?

Obrigado.

frank13
fonte

Respostas:

17

Use o ID do usuário e WP_User:

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

Atualizar

/**
 * 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;
}

Exemplo de uso:

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

Array
(
    [administrator] => Administrator
)
fuxia
fonte
Obrigado @toscho - não me pareceu o que eu esperava. Eu tenho um editor, um valor em branco / nulo e bbp_participant. Eu esperava ver Admin, Editor, Autor ou Assinante, pois essas são as únicas funções que estamos usando.
frank13
@ frank13 Veja minha atualização.
fuxia
2
Obrigado @toscho ... é muito código para obter um valor de dados que eu pensaria que estaria mais disponível.
frank13
Muito útil, obrigado! Tão triste e confuso, por que você não pode acessar a função do usuário mais diretamente. A função "pode ​​usuário" funciona ao contrário do que a maioria das pessoas gostaria.
Mike
7

Se bp_membersretornar uma matriz de WP_Userobjetos, cada um deverá ter a propriedade rolesque contém uma matriz das funções dos usuários.

Caso contrário, você pode usar get_user_metaa chave wp_capabilities, que retornará uma matriz de role => capabilitypares:

<?php
$caps = get_user_meta($user->ID, 'wp_capabilities', true);
$roles = array_keys((array)$caps);
chrisguitarguy
fonte
$ papers acaba sendo uma matriz. Eu estou olhando para conseguir o $user->IDpapel do. Apenas uma função, como nenhum usuário em nosso sistema, recebe mais de uma função.
frank13
$roles[0], feito.
Chrisguitarguy
Ok, obrigado @ChristopherDavis ... $ roles [0] retorna "0" em todos os usuários da lista
frank13
@chrisguitarguy $ papers [0] ainda funciona?
T.Todua 28/05
0

Pelo que entendi, provavelmente mudou ao longo dos anos, agora não é 'wp_capabilities'. Examinei os arquivos principais do WP, como eles o fazem agora e encontrei uma nova solução para isso. Aqui está o código que eu uso agora:

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

$cap então vem como uma matriz associativa, por exemplo:

{
    "administrator": true
}

ou

{
    "subscriber": true
}

Portanto, no seu caso, você provavelmente deve obter as chaves da matriz:

$caps_array = array_keys( $cap );

e então obtenha tudo disso. Eu precisava ver se o usuário tem a função de administrador, então verifiquei:

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

Eu tinha um ID do usuário, não o WP_Userobjeto inteiro , e não queria usar nenhuma solução que pudesse criar o userobjeto. Como eu verifiquei, get_user_metavai direto para o banco de dados para verificar esse parâmetro exato, portanto essa deve ser a rota mais rápida e com mais recursos.

Olga Farber
fonte