Como verificar se um usuário está em uma função específica?

59

Eu tenho um requisito bastante específico para mostrar texto diferente em um rótulo de campo na página de perfil do usuário com base na função do usuário atual. Não consigo descobrir como verificar se o uso atual é um "autor".

Estou procurando uma função como:

is_user_in_role($user, "author");

Eu imagino que isso seja bem simples, mas eu procurei por muito tempo sem uma resposta, então pensei em publicá-la aqui.

jessegavin
fonte

Respostas:

113

Se você precisar apenas disso, o usuário atual current_user_can()aceita funções e recursos.

ATUALIZAÇÃO : Passar o nome de uma função para current_user_can()não é mais garantido que funcione corretamente (consulte # 22624 ). Em vez disso, convém verificar a função do usuário:

$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
    //The user has the "author" role
}
Rarst
fonte
10
Eu sei que esta postagem foi respondida há muito tempo, mas se alguém chegar aqui ... consulte a documentação mais uma vez sobre current_user_can () -> "Não passe um nome de função para current_user_can (), pois isso não garante funcione corretamente (consulte a # 22624). Em vez disso, convém tentar a função de verificação da função do usuário criada pelo AppThemes. " ( codex.wordpress.org/Function_Reference/current_user_can )
bestprogrammerintheworld 28/01
1
^ Há um suporte de falta na instrução if
Aajahid
1
@Aajahid editado :)
Rarst
10

Eu estava procurando uma maneira de obter a função de um usuário usando o ID do usuário. Aqui está o que eu vim com:

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

Em seguida, uma is_user_in_role()função pode ser implementada da seguinte maneira:

function is_user_in_role( $user_id, $role  ) {
    return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}
Stephen M. Harris
fonte
1
funciona bem para eu obter a primeira função atribuída a um usuário.
Q Studio
E todas as funções atribuídas ao usuário?
Vishal Kumar Sahu
1
@Vishal Kumar, isso verificará todas as funções atribuídas ao usuário.
Stephen M. Harris
Esta função não existe, não tenho certeza se era apenas o velho ou o que, mas você deve usar a resposta acima ou o que eu postei abaixo
Smyles
2

Você também pode apenas criar um novo objeto de usuário:

$user = new WP_User( $user_id );

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

Não tenho certeza em qual versão get_user_roles_by_user_idfoi removida, mas não é mais uma função disponível.

sMyles
fonte
Isso é útil quando tenho que chamar outros métodos da classe WP_User.
Justin Waulters
0

Aqui está uma função que aceita um usuário e função para maior flexibilidade:

função my_has_role ($ user, $ role) {
  $ Papéis = $ Usuário-> Papéis; 
  retornar in_array ($ role, (array) $ user-> role);
}

if (my_has_role ($ user, 'some_role')) {
  //Fazer coisas
}
Ben
fonte
0

As funções de chamada no Objeto $user->rolesdo Usuário não retornam todas as funções. A maneira correta de descobrir se o usuário tem uma função ou capacidade está seguindo. (Isso funciona na versão 2.0.0 e superior do wp.) A função a seguir funciona com o ID do usuário. Você pode obter o ID do usuário atual$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;
       }
 }
Waqas Bukhary
fonte