¿Cómo eliminar la capacidad de que otros usuarios vean al Administrador en la lista de usuarios?

28 feb 2011, 20:55:27
Vistas: 16.3K
Votos: 15

(Nota del moderador: El título original era "Eliminar Admin del Menú de Usuarios")

He creado un rol de administrador de clientes que básicamente es un Editor con capacidad para añadir/eliminar usuarios. El artículo "El editor puede crear cualquier usuario nuevo excepto administrador" fue excelente para evitar que mi nuevo rol de administrador de clientes edite o cree un verdadero usuario administrador.

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

0
Todas las respuestas a la pregunta 4
11
11

Hola @Carlos:

Intenta agregar lo siguiente al archivo functions.php de tu tema, o en un archivo .php dentro de un plugin que estés desarrollando (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) { // No es administrador, remueve al administrador
    global $wpdb;
    $user_search->query_where = str_replace('WHERE 1=1',
      "WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
  }
}

Si tienes WordPress 3.0.x prueba esto en su lugar (ya que WordPress no añadió el hook 'pre_user_query' hasta la versión 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) { // No es administrador, remueve al administrador
    global $wpdb;
    $user_search->query_where = str_replace('WHERE 1=1',
      "WHERE 1=1 AND {$wpdb->users}.ID<>1",$user_search->query_where);
  }
}
28 feb 2011 21:22:22
Comentarios

Eso solo oculta el primer usuario agregado (que casi siempre es el administrador)... pero si el administrador tiene un ID diferente a 1, tendrás que modificar la consulta apropiadamente. También solo ocultará 1 administrador, no todos los administradores.

EAMann EAMann
28 feb 2011 21:50:28

En realidad solo pude hacer que esto funcione en la versión 3.1. El mismo código en versiones anteriores no parece funcionar (ni siquiera en 3.04).

Carlos Carlos
1 mar 2011 01:22:57

@EAMann - Cierto, estaba siendo conveniente. Si alguien necesita más, lo investigaré.

MikeSchinkel MikeSchinkel
1 mar 2011 05:33:02

@Carlos - ¿Necesitas la versión 3.0.x o está bien la 3.1?

MikeSchinkel MikeSchinkel
1 mar 2011 05:33:21

@Mike—vaya, sí, si estás dispuesto a ayudarme con eso sería maravilloso. He estado intentándolo sin éxito. Para mis propósitos, el ID de Admin 1 funciona perfectamente. Realmente lo agradezco.

Carlos Carlos
1 mar 2011 09:20:10

@Carlos - Para aclarar, ¿quieres decir que necesitas una versión 3.0.x o algo más?

MikeSchinkel MikeSchinkel
1 mar 2011 19:42:50

@Carlos - Mira mi respuesta actualizada.

MikeSchinkel MikeSchinkel
2 mar 2011 06:54:01

@Mike--funciona perfectamente. Muchas gracias por tu ayuda.

Carlos Carlos
4 mar 2011 21:01:51

@Carlos - Me alegra haber podido ayudar.

MikeSchinkel MikeSchinkel
4 mar 2011 21:57:21

¿Existe algún plugin que haga esto?

ReNiSh AR ReNiSh AR
4 jun 2014 18:52:46

@ReNiShAR Quizás, pero conocer qué plugins existen no es mi especialidad. En cambio, yo sé cómo crearlos. :) Tal vez Google lo sepa.

MikeSchinkel MikeSchinkel
7 jun 2014 06:20:50
Mostrar los 6 comentarios restantes
1
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 es así, solo selecciona usuarios que son 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
        );

    }
}
7 feb 2012 04:12:38
Comentarios

Solo para que lo sepas, para cualquiera en el futuro que no sea muy experto en SQL como yo, si quieres mostrar todos los usuarios que no son administradores (Editores, Autores, Suscriptores, etc.) pero aún así ocultar a los administradores, podrías cambiar esta línea: AND {$wpdb->usermeta}.meta_value = 0 y en su lugar hacer que el meta valor sea < 10 así: AND {$wpdb->usermeta}.meta_value < 10) lo cual mostrará todos los usuarios y ocultará a todos los administradores para todos los usuarios sin importar cuál sea su nivel.

Howdy_McGee Howdy_McGee
19 ago 2013 17:26:13
0

Los Niveles de Usuario están obsoletos, por lo que este método verifica las capacidades en su lugar:

/** Ocultar Administrador de la Lista de Usuarios **/
function isa_pre_user_query( $user_search ) {
    if ( !current_user_can( 'administrator' ) ) { // No es Administrador - Eliminar Administrador
        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' );
14 nov 2013 19:44:56
2

La acción pre_user_query se puede utilizar para modificar la consulta de usuarios desde WordPress 3.1.0

4 mar 2013 20:28:38
Comentarios

¿Estás seguro? ¿Puedes citar una fuente? Esta acción se utiliza en la versión actual del trunk - mira wp-includes/user.php, línea 549.

Johannes Pille Johannes Pille
27 sept 2013 12:48:20

wp_user_query no funciona en 3.6.1, sin embargo pre_user_query sí. No sé sobre 3.5.x

gwillie gwillie
27 sept 2013 11:37:55