Como restringir o acesso do painel apenas aos administradores?

19

Como restringiríamos o acesso à área de administração do WP a todos os usuários, exceto os administradores?
Os usuários do nosso site têm suas próprias páginas de perfil, que executam todas as funções necessárias.

Portanto, o administrador deve estar fora dos limites para todos, exceto os administradores.

Como fazer isso?

Robin I Knight
fonte
Você quer dizer que existem páginas de usuário que não precisam acessar nada localizado em seudominio.com.br/wp-admin ?
Cursmchale #
Sim, exatamente. Há algo de errado nisso?
que você
Não é só esclarecer.
Curtismchale 6/03/11

Respostas:

19

Podemos conectar-se à admin_initação e verificar se o usuário é um administrador usando a current_user_can()função para ver se o usuário atual pode manage_options, o que apenas um administrador pode fazer.

Este código, quando colado no seu arquivo functions.php, exibirá uma mensagem quando um não administrador tentar acessar o painel:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( __( 'You are not allowed to access this part of the site' ) );
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

Se preferir, você pode fornecer uma melhor experiência ao redirecionar o usuário para a página inicial:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_redirect( home_url() );
        exit;
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

Se você deseja redirecionar o usuário para sua página de perfil, substitua home_url()no código acima pelo link.

shea
fonte
Esta resposta não atende aos requisitos da pergunta. Primeiro, você está desabilitando o acesso à área de administração a um usuário com o recurso "manage_options" e um recurso pode ser atribuído a várias funções, não apenas administrador. Além disso, o recurso "manage_options" pode ser removido do administrador.
cybmeta
A verificação da manage_optionscapacidade do @cybmeta é a maneira aceita de verificar um usuário administrador. Até Mark Jaquith diz isso #
shea
O interlocutor pediu exatamente para verificar a função de usuário administrador e acho importante dar a resposta exata e explicar quando e por que verificar a capacidade pode ser melhor. Você diz manage_optionsque algo que apenas "administradores" podem fazer e que não é verdade, manage_optionsé um recurso e pode ser removido da função de administrador ou atribuído a outras funções de usuário. O importante é saber o que você quer fazer e escolher o melhor caminho. Veja minha resposta, eu explico isso.
cybmeta
Seu senhor, receba um +1! :) Procuro isso há horas! Também uma pequena melhoria. Site único, seu cheque é suficiente. Para multi-site que você gostaria de substituir manage_optionscom manage_network. Este último desabilitaria o painel também para "administradores de site" padrão, mas deixava o acesso disponível para Superadministradores (administradores de rede).
Rkeet 20/08/14
O principal problema com esta resposta é que ele entra em conflito com chamadas ajax. @cybmeta tem a resposta correta abaixo.
RiotAct 17/04
9

Algumas das respostas dadas podem ser boas na maioria das situações, mas acho que nenhuma delas garante exatamente o que é solicitado, porque nenhuma das respostas verifica as funções do usuário, verifica que os recursos e os recursos podem ser atribuídos e removidos. Portanto, para fornecer uma resposta exata, é necessário verificar as funções do usuário, não os recursos:

add_action( 'admin_init', 'allow_admin_area_to_admins_only');
function allow_admin_area_to_admins_only() {

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Allow ajax calls
            return;
      }

      $user = wp_get_current_user();

      if( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) {
           //Redirect to main page if no user or if the user has no "administrator" role assigned
           wp_redirect( get_site_url( ) );
           exit();
      }

 }

Se você deseja verificar se o usuário possui o recurso "manage_options", você pode. De fato, é a melhor opção na maioria dos casos. Embora esse recurso esteja associado por padrão aos usuários administradores, ele pode ser removido da função de administrador ou pode ser atribuído a outras funções de usuário. É por isso que, na maioria dos casos, verificar o que o usuário pode ou não fazer é melhor do que verificar a função do usuário. Portanto, na maioria dos casos, a verificação de recursos deve ser a maneira escolhida, mas você deve deixar esse conceito claro e escolher a melhor opção para sua situação e finalidade:

add_action( 'admin_init', 'admin_area_for_manage_options_only');
function admin_area_for_manage_options_only() {

      if( defined('DOING_AJAX') && DOING_AJAX ) {
            //Allow ajax calls
            return;
      }


      if( ! current_user_can( "manage_options" ) ) {
           //Redirect to main page if the user has no "manage_options" capability
           wp_redirect( get_site_url( ) );
           exit();
      }

 }
cybmeta
fonte
Essa é a resposta correta. Não entra em conflito com chamadas ajax.
RiotAct 17/04
3

Experimente o plugin Adminimize .
Você pode bloquear as coisas muito bem com isso.

Você também pode tentar configurar o acesso através do arquivo htaccess

goofydg1
fonte
1
+1 para administrar. Isso é um monstro de um plugin. Juntamente com algum plug-in personalizado do gerenciador de funções, ele simplesmente arrasa. (Se me derem uma opinião pessoal) :::: Como última observação: forneça mais informações do que apenas links, torna a Resposta mais completa.
Brasofilo 20/10/12
2
function wpse_11244_restrict_admin() {
    if (!current_user_can('update_core')) {
        wp_die(__('You are not allowed to access this part of the site'));
    }
}

add_action('admin_init', 'wpse_11244_restrict_admin', 1);
Gabi
fonte
4
'administrator'não é uma capacidade. Funciona apenas para manter a compatibilidade com versões anteriores. Verifique se há 'update_core'ou outros recursos administrativos.
fuxia
Além disso, os recursos podem ser atribuídos às funções; portanto, se você deseja permitir o acesso ao usuário "administrador", verifique as funções, não os recursos.
cybmeta
0

Coloque essas linhas no seu functions.php

function baw_no_admin_access()
{
 if( !current_user_can( 'administrator' ) ) {
     wp_redirect( home_url() );
     die();
  }
}
add_action( 'admin_init', 'baw_no_admin_access', 1 );
Junaid Munir
fonte
3
como @toscho disse 'administrador' não é uma capacidade, em vez usar os recursos de administração como 'update_core'
Pierre
0

Tente isso, nunca através de erros em face de um usuário final. Contra um bom UX. Esse código os redireciona para a página inicial.

    add_action( 'init', 'blockusers_init' );
function blockusers_init() {
if ( is_admin() && ! current_user_can( 'administrator' ) &&
! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
wp_redirect( home_url() );
exit;
}
}
Ahmad Awais
fonte
-1

Eu usaria o WP Frontend e o configuraria para que todos esperem administradores.

Benny
fonte
Por favor, forneça mais informações, em seguida, um link - torna a resposta mais completa
shea