Cómo restringir el acceso al escritorio solo para Administradores
¿Cómo podríamos restringir el acceso al área de administración de WordPress para todos los usuarios excepto los administradores?
Los usuarios de nuestro sitio tienen sus propias páginas de perfil que contienen todas las funciones que necesitan.
El panel de administración debería estar fuera de límites para todos excepto los administradores.
¿Cómo podemos lograr esto?
Podemos engancharnos a la acción admin_init
y verificar si el usuario es administrador utilizando la función current_user_can()
para comprobar si el usuario actual puede manage_options
, algo que solo un administrador puede hacer.
Este código, cuando se pegue en tu archivo functions.php, mostrará un mensaje cuando un usuario no administrador intente acceder al panel de control:
function wpse_11244_restrict_admin() {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
return;
}
if ( ! current_user_can( 'manage_options' ) ) {
wp_die( __( 'No tienes permiso para acceder a esta parte del sitio' ) );
}
}
add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );
Si lo prefieres, puedes ofrecer una mejor experiencia de usuario redirigiendo al usuario a la página de inicio en su lugar:
function wpse_11244_restrict_admin() {
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
return;
}
if ( ! current_user_can( 'manage_options' ) ) {
wp_redirect( home_url() );
exit;
}
}
add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );
Si deseas redirigir al usuario a su página de perfil, reemplaza home_url()
en el código anterior con el enlace correspondiente.

Esta respuesta no cumple con los requisitos de la pregunta. Primero, estás deshabilitando el acceso al área de administración a un usuario con la capacidad "manage_options" y una capacidad puede asignarse a múltiples roles, no solo al administrador. Además, la capacidad "manage_options" puede eliminarse del rol de administrador.

@cybmeta verificar la capacidad manage_options
es la forma aceptada de comprobar si es un usuario administrador. Incluso Mark Jaquith lo dice

El que preguntó solicitó específicamente verificar el rol de usuario administrador y creo que es importante darle la respuesta exacta y explicar cuándo y por qué verificar la capacidad puede ser mejor. Dices que manage_options
es algo que solo los "administradores" pueden hacer y eso no es cierto, manage_options
es una capacidad que puede eliminarse del rol de administrador o asignarse a otros roles de usuario. Lo importante es saber qué quieres hacer y elegir la mejor forma. Mira mi respuesta, explico esto.

¡Señor, se merece un +1! :) Llevaba horas buscando esto. También una pequeña mejora. Para un sitio único, su verificación es suficiente. Para multisitio, deberías reemplazar manage_options
con manage_network
. Esto último deshabilitaría el escritorio también para los "administradores de sitio" por defecto, pero mantendría el acceso disponible para los Super Administradores (administradores de red).

El principal problema con esta respuesta es que entra en conflicto con las llamadas ajax. @cybmeta tiene la respuesta correcta más abajo.

Podrías escribir un plugin y engancharlo a admin_init
.
El codex de hecho proporciona un ejemplo con la característica que estás buscando.
http://codex.wordpress.org/Plugin_API/Action_Reference/admin_init#Example:_Access_control

Algunas de las respuestas proporcionadas pueden ser válidas en la mayoría de situaciones, pero creo que ninguna garantiza hacer exactamente lo que se pide porque ninguna de ellas verifica los roles de usuario, sino que verifican capacidades y las capacidades pueden asignarse y eliminarse de los roles. Por lo tanto, para dar una respuesta exacta, se deben verificar los roles de usuario, no las capacidades:
add_action( 'admin_init', 'allow_admin_area_to_admins_only');
function allow_admin_area_to_admins_only() {
if( defined('DOING_AJAX') && DOING_AJAX ) {
//Permitir llamadas AJAX
return;
}
$user = wp_get_current_user();
if( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) {
//Redirigir a la página principal si no hay usuario o si el usuario no tiene el rol "administrator"
wp_redirect( get_site_url( ) );
exit();
}
}
Si deseas verificar que el usuario tenga la capacidad "manage_options", puedes hacerlo. De hecho, es la mejor opción en la mayoría de los casos. Aunque esta capacidad está asociada por defecto a los usuarios administradores, la capacidad puede eliminarse del rol de administrador o asignarse a otros roles de usuario. Es por eso que, en la mayoría de los casos, verificar lo que el usuario puede o no puede hacer es mejor que verificar el rol del usuario. Por lo tanto, en la mayoría de los casos, verificar capacidades debería ser la opción elegida, pero debes tener este concepto claro y elegir la mejor opción para tu situación y propósito:
add_action( 'admin_init', 'admin_area_for_manage_options_only');
function admin_area_for_manage_options_only() {
if( defined('DOING_AJAX') && DOING_AJAX ) {
//Permitir llamadas AJAX
return;
}
if( ! current_user_can( "manage_options" ) ) {
//Redirigir a la página principal si el usuario no tiene la capacidad "manage_options"
wp_redirect( get_site_url( ) );
exit();
}
}

Prueba el plugin Adminimize.
Puedes bloquear cosas bastante bien con eso.
También podrías intentar configurar el acceso a través del archivo htaccess

+1 para Adminimize. Es un plugin bestial. Combinado con algún plugin personalizado de gestión de roles, simplemente es increíble. (Permítanme una opinión personal) :::: Como última nota: por favor proporcione más información que solo enlaces, esto hace que la respuesta sea más completa.

'administrator'
no es una capacidad. Funciona solo para mantener la compatibilidad con versiones anteriores. Verifica 'update_core'
u otras capacidades de administrador.

Prueba esto, nunca muestres errores directamente al usuario final. Va en contra de una buena experiencia de usuario (UX). Este código los redirige a la página de Inicio.
add_action( 'init', 'blockusers_init' );
function blockusers_init() {
if ( is_admin() && ! current_user_can( 'administrator' ) &&
! ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) {
wp_redirect( home_url() );
exit;
}
}

Yo usaría WP Frontend y lo configuraría para todos excepto para los administradores.
