¿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.

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

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

    }
}

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

1

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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.