¿Eliminar la capacidad de otros usuarios para ver el administrador en la lista de usuarios?

15

( Nota del moderador: el título original era "Eliminar administrador del menú del usuario")

He creado un rol de administrador de cliente que es esencialmente un Editor con capacidad para agregar / eliminar usuarios. El artículo "El editor puede crear cualquier usuario nuevo, excepto el administrador " fue excelente para ayudar a evitar que mi nueva función de administrador del cliente edite o cree un verdadero usuario administrador.

Sin embargo, lo ideal sería ocultar a los administradores de los administradores del cliente cuando están viendo usuarios. Quiero que "crean" que son los administradores de su sitio, pero no quiero que puedan ver siquiera mi rol / usuario, esencialmente ocultando el rol de "administrador" cuando están en "Usuarios" panel.

Carlos
fuente

Respuestas:

10

Hola @Carlos:

Intente agregar lo siguiente al functions.phparchivo de su tema , o en un .phparchivo dentro de un complemento que podría estar escribiendo (que funciona para 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);
  }
}

Si tiene WordPress 3.0.x intente esto (ya que WordPress no agregó el 'pre_user_query'gancho hasta 3.1):

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
fuente
1
Eso solo oculta el primer usuario agregado (que casi siempre es el administrador) ... pero si el administrador tiene una ID diferente a 1, tendrá que cambiar la consulta adecuadamente. También ocultará solo 1 administrador, no todos los administradores.
EAMann
De hecho, solo pude hacer que esto funcione en la versión 3.1. El mismo código en cualquier versión anterior no parece hacer el truco (incluso 3.04).
Carlos
@EAMann: Cierto, estaba siendo conveniente. Si alguien necesita más, lo investigaré.
MikeSchinkel
@Carlos - ¿Necesita v3.0.x, o está bien la v3.1?
MikeSchinkel
@ Mike: wow, sí, si estuvieras dispuesto a ayudarme con eso, sería maravilloso. He estado pirateando en vano. Para mis propósitos, la ID de administrador 1 funciona bien. Realmente lo aprecio.
Carlos
10

Aquí hay una modificación a la respuesta de MikeSchinkel que verifica si el usuario actual tiene un rol de administrador y, si no, solo selecciona a los usuarios que están suscriptores.

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
fuente
1
Solo para su información Para cualquier persona en el futuro que no sea muy competente en SQL como yo, si desea mostrar a todos los usuarios que no son administradores (Editores, Autores, Suscriptores, etc.) pero aún así ocultar administradores, puede cambiar esta línea: AND {$wpdb->usermeta}.meta_value = 0y en su lugar, haga que el valor meta <10 sea así: AND {$wpdb->usermeta}.meta_value < 10)que mostrará a todos los usuarios y ocultará a todos los administradores de todos los usuarios sin importar su nivel.
Howdy_McGee
2

Los niveles de usuario están en desuso , por lo que este método compara las capacidades en su lugar:

/** 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
fuente
1

pre_user_queryLa acción se puede utilizar para modificar la consulta del usuario desde WordPress 3.1.0

Virgo
fuente
1
wp_user_querySin embargo, no funciona en 3.6.1 pre_user_query. no sé acerca de
3.5.x
1
¿Estas seguro? ¿Puedes citar una fuente? Esta acción se usa en el enlace troncal actual; consulte wp-includes / user.php, línea 549 .
Johannes Pille