WordPress Roles

Cómo restringir el acceso al back-end de WordPress a usuarios no administradores

A continuación vamos a ver cómo bloquear o restringir el acceso al back-end o escritorio de WordPress (con y sin plugins), incluso ocultaremos el admin bar para evitar tentaciones de acceder al panel de control.

En muchas ocasiones nos puede interesar tener suscriptores en nuestro sitio, pero que no queramos dejarles acceder a su perfil en el panel de administración, sólo que puedan logearse, hacer comentarios, comprar productos, etc… y cerrar sesión. O simplemente que queramos dar acceso al back-end sólo a los usuarios con rol de administrador.

Existen varias maneras de restringir o bloquear el acceso a un tipo determinado de usuarios. La primera y más sencilla es hacer uso de un plugin. Existen varios, entre ellos podemos encontrar WP Secure que entre otras cosas te permite configurar el acceso al panel de administración, bloqueando por tipo de usuario o IP.

El plugin de ecommerce más fácil de usar para WordPress

Restringir el acceso al back-end por IP

Si queremos bloquear el acceso al administrador de WordPress por IP, para que por ejemplo sólo podamos acceder desde nuestra casa u oficina, tendremos que añadir estas líneas en el fichero .htaccess de la raíz del sitio.

<files wp-login.php>
  Order Deny, Allow
  Deny from all
  Allow from xx.xx.xx.xx
  Allow from xx.xx.xx.xx
</files>

Podemos permitir el acceso a varias IPs, escribiendo tantos “Allow from” como queramos. A continuación, nos vamos a la carpeta wp-admin y creamos otro fichero .htaccess si no existe y escribimos éstas líneas dentro:

Order Deny,Allow
Deny from all
Allow from xx.xx.xx.xx
Allow from xx.xx.xx.xx

Restringir el acceso al back-end por rol de usuario

Como sabemos en WordPress existen hasta 6 tipos de roles diferentes: SuperAdministrador (para instalaciones de multisite), Administrador, Editor, Autor, Colaborador y Suscriptor. En algunos casos podemos tener la necesidad de bloquear el acceso a uno o varios tipos de roles.

wordpress user roles

Para ello vamos a usar la función current_user_can (si el usuario actual puede…) en el admin_init, para comprobar si el usuario que está intentando acceder cumple con nuestros requisitos o no, comprobando su rol. Ésta función acepta como parámetros la capacidad (capabilities) o el rol, por lo que podremos hacer cualquier ajuste según nuestras necesidades.

Si queremos dejar acceder sólo a Administradores preguntaremos si el usuario actual tiene rol de administrador: current_user_can(‘administrator’). Si quisiéramos dejar acceder solamente a Administradores y Editores tenemos dos opciones, podemos preguntar por (current_user_can(‘administrator’) || current_user_can(‘editor’)) o buscar una capability que sólo posean esos dos roles, por ejemplo edit_pages y preguntar por ella: current_user_can(‘edit_pages’).

Crearemos una función en nuestro archivo functions.php donde comprobaremos el rol del usuario que intenta acceder al panel de administración (en el admin-init) y si no cumple nuestros requisitos, le redirigimos a la home. Y a continuación crearemos otra función para ocultar la barra de administración que aparece en la parte superior (admin bar).

Hay que tener en cuenta que desde el front se pueden hacer solicitudes AJAX, y éstas necesitan acceso al área de administración (wp-admin/admin-ajax.php) y no deben ser bloqueadas.

<?php

// Restrict back-end for administrators only
function restrict_admin_area_by_rol() {
  if ( ! current_user_can( 'manage_options' ) && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
    wp_redirect( site_url() );
    exit;
  }
}
add_action( 'admin_init', 'restrict_admin_area_by_rol', 1 );

// Show admin bar only for administrators
function hide_admin_bar($content) {
  return ( current_user_can('manage_options') ) ? $content : false;
}
add_filter( 'show_admin_bar' , 'hide_admin_bar');

Con esto conseguiremos bloquear el acceso al panel de administración a usuarios que no sean administradores. Si tratas de entrar con un rol inferior, el proceso de login se ejecuta correctamente pero serás redirigido siempre al front.

Con esto quiero decir que tienes la sesión iniciada aunque no lo veas. Es por esto que en la siguiente entrada vamos a ver cómo crear un formulario de log-in/log-out en el front para permitir al resto de usuarios iniciar y cerrar sesión.

¿Te ha resultado útil esta información? 🍺

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.

Comentarios

8 comentarios en Cómo restringir el acceso al back-end de WordPress a usuarios no administradores

    1. Amigo, me redirecciona: «500 Internal Server Error» cada vez que lo hago…parece que no trabaja así.
      Saludos Leo

  1. Hola.. tengo una pregunta.. supongamos que quiero limitar el acceso a poder acceder desde toda una subred.. por ejemplo 192.168.1.* como sería..??? sería algo como «Allow from 192.168.1.XX» ???

    1. Hola Leonardo,

      No lo he probado, pero creo que en tu caso te serviría poner: 192.168.1.0/255

      0/255 es el rango, podrías especificarlo más, por ejemplo: 24/99, y solo contemplaría las IPs:

      192.168.1.24
      192.168.1.25
      192.168.1.26

      192.168.1.99

      Pruébalo y me cuentas

  2. Hola Pablo,

    He encontrado un ligerisimo error en el código que has publicado. Concretamente en la línea 9 del código para que solo puedan entrar en el backend los administradores.

    El problema es que cuando llamas a la función restrict_admin_area_by_rol, has puesto un espacio por delante y por detrás en las comillas. Simplemente, eliminamos esos dos espacios, y funciona correctamente.

    Te lo dije ayer en el Meetup de WordPress Madrid, y te lo repito hoy por aquí, muchas gracias por todas tus aportaciones, y por ayudarnos en tantas y tantas cosas de WordPress. Un abrazo.

  3. Observando el código en la linea 9 se podría utilizar admin_menu en lugar de admin_init, por lo menos en mi caso, ya que admin_init aplica una restricción más completa la cual impide el envio de datos por formulario a usuarios sin privilegios, mientras que admin_menu si me permite recaudar información por formulario y bloquea el acceso al panel

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *:

  • El fin del tratamiento es únicamente la moderación de comentarios para evitar spam
  • La legitimación es tu consentimiento al comentar
  • No se comunicará ningún dato a terceros salvo por obligación legal
  • Tienes derecho al acceso, rectificación y eliminación de los comentarios