Remover a capacidade de outros usuários exibirem o administrador na lista de usuários?

15

( Nota do moderador: o título original era "Remover administrador do menu do usuário")

Eu criei uma função de administrador do cliente, que é essencialmente um Editor com capacidade de adicionar / remover usuários. O artigo "O editor pode criar qualquer novo usuário, exceto o administrador " foi excelente para ajudar a impedir que minha nova função de administrador de cliente edite ou crie um usuário de administrador True.

No entanto, o que seria ideal é ocultar os administradores dos administradores de clientes quando eles estiverem visualizando usuários. Quero que eles "acreditem" que são administradores do site, mas não quero que eles consigam exibir minha função / usuário - ocultando essencialmente a função de "administrador" quando estiverem nos "Usuários" painel.

Carlos
fonte

Respostas:

10

Olá @Carlos:

Tente adicionar o seguinte ao functions.phparquivo do seu tema ou em um .phparquivo dentro de um plug-in que você possa estar escrevendo (que funciona no WordPress 3.1.x):

add_action('pre_user_query','yoursite_pre_user_query');
function yoursite_pre_user_query($user_search) {
  $user = wp_get_current_user();
  if ($user->ID!=1) { // Is not administrator, remove administrator
    global $wpdb;
    $user_search->query_where = str_replace('WHERE 1=1',
      "WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
  }
}

Se você possui o WordPress 3.0.x, tente isso (já que o WordPress não adicionou o gancho até a versão 3.1):'pre_user_query'

add_action('pre_user_search','yoursite_pre_user_search');
function yoursite_pre_user_search($user_search) {
  $user = wp_get_current_user();
  if ($user->ID!=1) { // Is not administrator, remove administrator
    global $wpdb;
    $user_search->query_where = str_replace('WHERE 1=1',
      "WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
  }
}
MikeSchinkel
fonte
1
Isso oculta apenas o primeiro usuário adicionado (que quase sempre é o administrador) ... mas se o administrador tiver um ID diferente de 1, será necessário alterar a consulta adequadamente. Também ocultará apenas 1 administrador, nem todos os administradores.
EAMann
Na verdade, eu só consegui fazer isso funcionar na versão 3.1. O mesmo código em todas as versões anteriores parece não funcionar (até a versão 3.04).
Carlos
@EAMann - É verdade que eu estava sendo conveniente. Se alguém precisar de mais, vou dar uma olhada.
precisa saber é o seguinte
@Carlos - Você precisa da v3.0.x ou da v3.1?
precisa saber é o seguinte
@ Mike - uau, sim, se você estiver disposto a me ajudar com isso, seria maravilhoso. Estive cortando sem sucesso. Para meus propósitos, o ID de administrador 1 funciona bem. Eu realmente gostei disso.
Carlos
10

Aqui está um mod da resposta de MikeSchinkel que verifica se o usuário atual tem um papel de administrador e, se não, ele seleciona apenas os usuários assinantes.

add_action('pre_user_query','yoursite_pre_user_query');
function yoursite_pre_user_query($user_search) {
    $user = wp_get_current_user();

    if ( $user->roles[0] != 'administrator' ) { 
        global $wpdb;

        $user_search->query_where = 
        str_replace('WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.ID IN (
                 SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
                    WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}user_level' 
                    AND {$wpdb->usermeta}.meta_value = 0)", 
            $user_search->query_where
        );

    }
}
patnz
fonte
1
Apenas para sua informação, para qualquer pessoa no futuro que não seja muito proficiente em SQL, como eu, se quiser mostrar todos os usuários que não são administradores (editores, autores, assinantes etc.), mas ainda ocultam os administradores, você pode alterar esta linha: AND {$wpdb->usermeta}.meta_value = 0e em vez disso, faça o meta-valor <10 da seguinte forma: o AND {$wpdb->usermeta}.meta_value < 10)que mostrará todos os usuários e ocultará todos os administradores de todos os usuários, independentemente do nível deles.
Howdy_McGee
2

Os níveis de usuário foram descontinuados , portanto, esse método verifica os recursos:

/** Hide Administrator From User List **/
function isa_pre_user_query( $user_search ) {
    if ( !current_user_can( 'administrator' ) ) { // Is Not Administrator - Remove Administrator
        global $wpdb;

        $user_search->query_where = str_replace(
            'WHERE 1=1', 
            "WHERE 1=1 AND {$wpdb->users}.ID IN (
              SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
              WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}capabilities'
              AND {$wpdb->usermeta}.meta_value NOT LIKE '%administrator%' )", 
            $user_search->query_where
        );
    }
}

add_action( 'pre_user_query', 'isa_pre_user_query' );
Howdy_McGee
fonte
1

pre_user_queryA ação pode ser usada para alterar a consulta do usuário desde o WordPress 3.1.0

Virgem
fonte
1
wp_user_querynão funciona no 3.6.1, no entanto pre_user_query. não sei sobre 3.5.x
gwillie
1
Você está certo? Você pode citar uma fonte? Esta ação é usada no tronco atual - consulte wp-includes / user.php, linha 549 .
Johannes Pille