¿Cómo restringir el acceso al tablero solo a administradores?

19

¿Cómo restringiríamos el acceso al área de administración de WP a todos los usuarios, excepto a los administradores?
Los usuarios de nuestro sitio tienen sus propias páginas de perfil que realizan todas las funciones que necesitan.

Por lo tanto, el administrador debe estar fuera del alcance de todos, excepto los administradores.

¿Como hacer eso?

Robin I Knight
fuente
¿Quiere decir que hay páginas de usuario 'frontales' que no requieren acceder a nada ubicado en yourdomain.com/wp-admin ?
curtismchale
Sí exactamente. ¿Hay algo malo con eso?
Robin I Knight
No, solo aclarando.
curtismchale

Respuestas:

19

Podemos conectarnos a la admin_initacción y verificar si el usuario es un administrador utilizando la current_user_can()función para ver si el usuario actual manage_optionspuede hacerlo, algo que solo un administrador puede hacer.

Este código, cuando se pega en el archivo functions.php, mostrará un mensaje cuando un usuario que no sea administrador intente acceder al tablero:

function wpse_11244_restrict_admin() {

    if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
        return;
    }

    if ( ! current_user_can( 'manage_options' ) ) {
        wp_die( __( 'You are not allowed to access this part of the site' ) );
    }
}

add_action( 'admin_init', 'wpse_11244_restrict_admin', 1 );

Si lo prefiere, puede proporcionar una mejor experiencia de usuario redirigiendo al usuario a la página de inicio:

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 desea redirigir al usuario a su página de perfil, reemplácelo home_url()en el código anterior con el enlace.

Ella a
fuente
Esta respuesta no cumple con los requisitos de la pregunta. Primero, está deshabilitando el acceso al área de administración a un usuario con la capacidad "manage_options" y se puede asignar una función a múltiples roles, no solo al administrador. Además, la capacidad "manage_options" se puede eliminar del administrador.
cybmeta
@cybmeta la verificación de la manage_optionscapacidad es la forma aceptada de verificar un usuario administrador Incluso Mark Jaquith lo dice
shea
El interrogador solicitó exactamente la verificación del rol de usuario administrador y creo que es importante darle la respuesta exacta y explicar cuándo y por qué la verificación de la capacidad puede ser mejor. Usted dice que manage_optionses algo que solo los "administradores" pueden hacer y que no es cierto, manage_optionses una capacidad y puede eliminarse de la función de administrador o asignarse a otras funciones de usuario. Lo importante es saber lo que quiere hacer y elegir la mejor manera. Mira mi respuesta, te explico esto.
cybmeta
Usted señor, obtenga un +1! :) ¡He estado buscando esto por horas! También una pequeña mejora. Sitio único su cheque es suficiente. Para multi-sitio en las que desea reemplazar manage_optionscon manage_network. Este último deshabilitaría el tablero también para los "administradores del sitio" predeterminados, pero dejaría acceso disponible para los Super Administradores (administradores de red).
rkeet
El problema principal con esta respuesta es que choca con las llamadas ajax. @cybmeta tiene la respuesta correcta a continuación.
RiotAct
9

Algunas de las respuestas dadas pueden estar bien en la mayoría de las situaciones, pero creo que ninguna de ellas garantiza hacer exactamente lo que se les pide porque ninguna de las respuestas verifica los roles de los usuarios, comprueban que las capacidades y capacidades pueden asignarse y eliminarse de los roles. Entonces, para dar una respuesta exacta, se deben verificar los roles de los usuarios, 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 ) {
            //Allow ajax calls
            return;
      }

      $user = wp_get_current_user();

      if( empty( $user ) || !in_array( "administrator", (array) $user->roles ) ) {
           //Redirect to main page if no user or if the user has no "administrator" role assigned
           wp_redirect( get_site_url( ) );
           exit();
      }

 }

Si desea verificar que el usuario tenga la capacidad de "administrar_opciones", puede hacerlo. De hecho, es la mejor opción en la mayoría de los casos. Aunque esta capacidad está asociada de forma predeterminada a los usuarios administradores, la capacidad se puede eliminar de la función de administrador o se puede asignar a otras funciones de usuario. Es por eso que, en la mayoría de los casos, verificar lo que el usuario puede o no hacer es mejor que verificar la función del usuario. Por lo tanto, en la mayoría de los casos, verificar las capacidades debe ser la forma elegida, pero debe tener este concepto claro y elegir la mejor opción para su 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 ) {
            //Allow ajax calls
            return;
      }


      if( ! current_user_can( "manage_options" ) ) {
           //Redirect to main page if the user has no "manage_options" capability
           wp_redirect( get_site_url( ) );
           exit();
      }

 }
cybmeta
fuente
Esta es la respuesta correcta. No choca con las llamadas ajax.
RiotAct
3

Pruebe el complemento Administrar .
Puedes bloquear las cosas bastante bien con eso.

También puede intentar configurar el acceso a través del archivo htaccess

goofydg1
fuente
1
+1 para Administrar. Esa es una bestia de un complemento. Junto con un complemento de administrador de roles personalizado, simplemente es genial. (Si se me excusa una opinión personal) :::: Como última nota: por favor brinde más información que solo enlaces, hace que la Respuesta sea más completa.
brasofilo
2
function wpse_11244_restrict_admin() {
    if (!current_user_can('update_core')) {
        wp_die(__('You are not allowed to access this part of the site'));
    }
}

add_action('admin_init', 'wpse_11244_restrict_admin', 1);
Gabi
fuente
44
'administrator'No es una capacidad. Funciona solo para mantener la compatibilidad con versiones anteriores. Verifique 'update_core'u otras capacidades administrativas.
fuxia
Además, las capacidades se pueden asignar a roles, por lo que si desea permitir el acceso al usuario "administrador", debe verificar los roles, no las capacidades.
cybmeta
0

Pon estas líneas en tu 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 );
Junaid Munir
fuente
3
como @toscho dijo que 'administrador' no es una capacidad, en cambio use capacidades de administrador como 'update_core'
Pierre
0

Pruebe esto, nunca a través de errores frente a un usuario final. Contra un buen UX. Este código los redirige a 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;
}
}
Ahmad Awais
fuente
-1

Me gustaría utilizar WP frontend y configurarlo para todo el mundo esperan que los administradores.

Benny
fuente
Proporcione más información luego un enlace - hace que la respuesta sea más completa
shea