Se o usuário atual for um administrador ou editor


101

Como posso verificar se o usuário conectado atual é um administrador ou um editor?

Eu sei como fazer cada um individualmente:

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

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

Mas como faço para trabalhar juntos? Ou seja, o usuário é um administrador ou editor?


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

Respostas:


190

Primeira resposta, não relacionada ao WordPress, porque é apenas PHP: use a lógica "OR" operador:

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

Se você deseja verificar mais de duas funções, pode verificar se as funções do usuário atual estão dentro de uma matriz de funções, algo como:

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

No entanto, current_user_canpode ser usado não apenas com o nome da função dos usuários, mas também com recursos.

Portanto, assim que editores e administradores puderem editar páginas, sua vida ficará mais fácil com a verificação desses recursos:

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

Dê uma olhada aqui para obter mais informações sobre recursos.


1
você precisa verificar se is_logged_in();?
RobBenz

3
@RobBenz não, em nenhum dos casos. Como current_user_can()sempre retorna false se o usuário não estiver conectado e wp_get_current_user()retornará um usuário sem nenhuma função se o usuário não estiver conectado, portanto array_intersect(), sempre será falso.
gmazzap

1
No PHPDoc da current_user_can()função, podemos ver a linha " Embora a verificação de funções específicas no lugar de uma capacidade seja suportada em parte, essa prática é desencorajada, pois pode produzir resultados não confiáveis ". Então eu acho que seria melhor evitar o uso de papéis durante a verificação de :-) capacidade de um usuário
Erenor Paz

Quando uso o array_intersectmétodo, recebo um aviso do PHP em nosso log de erros do servidor informando array_intersect(): Argument #2 is not an array. Isso ocorre porque os usuários que estão verificando têm apenas uma função?
Garconis

@ Garconis normalmente deve ser uma matriz. Por alguma razão, parece que você não é uma matriz. array_intersect($allowed_roles, (array)$user->roles )funcionará sem problemas.
gmazzap

9

Primeiro, current_user_can()não deve ser usado para verificar a função de um usuário - deve ser usado para verificar se um usuário tem um recurso específico .

Segundo, em vez de se preocupar com a função do usuário, mas focando-se nos recursos, você não precisa se preocupar em fazer coisas como o problema perguntado na pergunta original (que é verificar se o usuário é um administrador ou um editor). Em vez disso, se current_user_can()estivesse sendo usado como pretendido, que é verificar os recursos de um usuário, não a função deles, você não precisaria da verificação condicional para conter um teste "ou" (||). Por exemplo:

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

edit_pages é um recurso das funções de administrador e editor, mas não de funções inferiores, como autores. É assim que current_user_can()se destina a ser usado.


Observação : os desenvolvedores WP de alto nível concordam com esta resposta. Você deve tentar evitar a verificação de função, tanto quanto possível, usar recursos. Atualmente, estou trabalhando em um projeto com várias funções que têm apenas o limite de 'leitura'. A única solução é a verificação de função para mim. Desculpe, não consigo encontrar o link, foi uma discussão aberta no WP Github.
Bjorn

Essa deve ser a resposta aceita, IMO. current_user_cangeralmente deve ser usado para recursos, não para papéis.
Armstrongest

2

Como a resposta do @butlerblog afirmou, você não deve usar o current_user_can para verificar uma função

Este aviso foi adicionado especificamente na documentação da has_capfunção PHP, chamada porcurrent_user_can

Embora a verificação de uma função no lugar de uma capacidade seja parcialmente suportada, essa prática é desencorajada, pois pode produzir resultados não confiáveis.

A maneira CORRETA de fazer isso é obter o usuário e verificar o $user->rolesseguinte:

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

Aqui estão algumas funções auxiliares que eu uso para fazer isso (como às vezes eu não quero apenas o usuário atual):

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

Então você pode fazer isso:

current_user_has_role( 'editor' );

ou

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
Seria ótimo se você pudesse explicar como isso ajuda o OP.
bravokeyl

Você pode permitir que para ver a página apenas "editor" ou "membro" você pode enviar este código direto na generic-page.php
seowmx

4
Por favor, não solte o código. Adicione comentários e algumas explicações sobre como isso resolve o problema dos solicitantes.
Kraftner 29/09/16
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.