¿Cómo eliminar la capacidad de que otros usuarios vean al Administrador en la lista de usuarios?
(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".

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

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.

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

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

@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 - Para aclarar, ¿quieres decir que necesitas una versión 3.0.x o algo más?

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

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.

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

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