Cómo restringir el acceso al escritorio solo para Administradores

5 mar 2011, 17:15:29
Vistas: 27.7K
Votos: 20

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

3
Comentarios

¿Quieres decir que hay páginas de usuario 'visibles' que no requieren acceder a nada ubicado en http://yourdomain.com/wp-admin ?

curtismchale curtismchale
5 mar 2011 17:37:34

Sí exactamente. ¿Hay algo malo con eso?

Robin I Knight Robin I Knight
5 mar 2011 17:42:54

No, solo estaba aclarando.

curtismchale curtismchale
6 mar 2011 04:01:25
Todas las respuestas a la pregunta 8
6
21

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.

27 dic 2012 12:17:19
Comentarios

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 cybmeta
11 jun 2014 17:36:57

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

shea shea
12 jun 2014 01:26:00

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.

cybmeta cybmeta
12 jun 2014 11:02:44

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

rkeet rkeet
20 ago 2014 14:57:33

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

RiotAct RiotAct
17 abr 2019 23:04:19

@RiotAct Estoy bastante seguro de que incluí una verificación para AJAX en el segundo ejemplo, pero tienes razón, debería haber usado el método más confiable

shea shea
18 abr 2019 03:33:14
Mostrar los 1 comentarios restantes
1

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

5 mar 2011 22:13:18
Comentarios

Esta no es una respuesta completa - debería ser más que una pista y un enlace

shea shea
8 ene 2013 06:37:41
1

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

 }
27 mar 2014 11:57:06
Comentarios

Esta es la respuesta correcta. No entra en conflicto con las llamadas ajax.

RiotAct RiotAct
17 abr 2019 23:04:42
1

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

5 mar 2011 19:38:56
Comentarios

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

brasofilo brasofilo
20 oct 2012 08:02:45
2
function wpse_11244_restrict_admin() {
    if (!current_user_can('update_core')) {
        wp_die(__('No tienes permiso para acceder a esta sección del sitio'));
    }
}

add_action('admin_init', 'wpse_11244_restrict_admin', 1);
10 may 2012 16:21:30
Comentarios

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

fuxia fuxia
10 may 2012 19:10:34

Además, las capacidades pueden asignarse a roles, así que si deseas permitir el acceso al usuario "administrador", deberías verificar los roles, no las capacidades.

cybmeta cybmeta
11 jun 2014 17:47:11
1

Coloca estas líneas en tu archivo functions.php

function baw_no_admin_access()
{
 if( !current_user_can( 'administrator' ) ) {
     wp_redirect( home_url() );
     die();
  }
}
add_action( 'admin_init', 'baw_no_admin_access', 1 );
27 dic 2012 08:55:36
Comentarios

como dijo @toscho 'administrator' no es una capacidad, en su lugar usa capacidades de administrador como 'update_core'

Pierre Pierre
27 dic 2012 11:33:25
0

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;
}
}
11 jun 2014 17:07:17
1
-1

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

6 mar 2011 07:21:15
Comentarios

Por favor, proporciona más información además de un enlace, esto hace que una respuesta sea más completa

shea shea
8 ene 2013 06:42:10