Cómo hacer de nuestro WordPress un área privada » sin plugins

De pronto, llega una situación en la que necesitas tener una intranet solo con acceso para ciertos usuarios, especialmente si se trata de algún tipo de herramienta interna utilizada por una empresa  grupo privado; o, simplemente, quieres usar WordPress como una «base de datos» privada para tus cosas, para anotar todos los plugins que te gustan, etc.

¿Puedes hacerlo privado? Pues es MUY fácil y si quieres, no necesitas ningún plugin. Para conseguirlo, tenemos diferentes opciones:

  • Usar un plugin como Ultimate MemberWP Private Content Plus nos va a permitir hacerlo de forma sencilla y con muchas más opciones (además, aunque tienen funcionalidades de pago, son gratuitos).
  • Si no te da miedo el código (y no hablo de ser programador; verás que no hace falta saber código PHP) y buscas algo más sencillo y ligero, podrás hacerlo con tus propias manos y sentirte un poquito más realizado hoy 😀

Vamos a obviar la opción de plugins y pasaremos directamente a hacerlo mediante código y las propias opciones que WordPress ofrece. Vamos a ver dos escenarios:

  1. Toda la web privada. Si estás logueado, ves la web, sino… te redirigo al login para que puedas acceder.
  2. Solo haremos privadas ciertas páginas, para que cualquiera pueda ver las páginas públicas, y solo cierto grupo de usuarios con permisos pueda ver el contenido privado.

1.- Todas las páginas de WordPress como una zona privada

Como no deberíamos tocar nunca el código del tema directamente, lo recomendable en estos casos es crear un tema hijo; una opción MUY sencilla de llevar a cabo.

Por dar una opción sencilla y así no tener que crear el tema hijo a mano, he optado por hacer uso del plugin Child Theme Configurator, que te facilita la creación de un tema hijo a golpe de clics; incluso te permite duplicar, directamente desde el plugin, cualquier archivo del tema padre al hijo.

Así que, he creado el tema hijo con este plugin y he editado el archivo functions.php del tema hijo añadiendo este fragmento de código:

/**
 * Redirigir a usuarios no logueados
 */
function agm_webprivada()
{
	if ( !is_user_logged_in() )
	{
		// Obtenemos la página actual  
		global $wp;
		$url_actual = home_url(add_query_arg(array(),$wp->request));
        
		// Redireccionamos
		if ( preg_replace('/\?.*/', '', $url_actual)
		  != preg_replace('/\?.*/', '', wp_login_url()) )
		{
		  wp_safe_redirect( wp_login_url( $url_actual ), 302 ); exit();
		}
	}
}

add_action( 'template_redirect', 'agm_webprivada' );

2.- Contenido privado solo para usuarios con permisos

La forma más sencilla de restringir el acceso a una página específica (u otro tipo de contenido – post type) es usar los diferentes ajustes de ‘Visibilidad’ que WordPress proporciona de forma predeterminada. Así que… comencemos por comprender la diferencia entre una página protegida por contraseña y una página privada.

Puedes encontrar estas opciones en la zona derecha de la pantalla, en el metabox «Publicar»:

Captura de la pantalla de edición de entrada/página en WordPress

En la configuración de visibilidad, hay 3 opciones:

  1. Público: de forma predeterminada, el contenido está disponible para todos los visitantes de nuestra web.
  2. Protegido con contraseña: Con la contraseña concreta de esta página, los lectores podrán desbloquear el acceso al contenido.
  3. Privado: esta opción prohibirá el acceso a toda persona que no tenga un usuario con los permisos necesarios. Por defecto, solo los usuarios con el rol Super administrador, Administrador o editor podrán acceder a estas páginas.

Por tanto, vamos a centrarnos en la opción b y c.

2(b).- Páginas protegidas con contraseña

Esta es una opción muy simple. Ofrece la posibilidad de proteger con contraseña las páginas y las entradas de forma individual. Para ello, simplemente debes asignar una contraseña a esa página o entrada.

Cualquier persona que conozca la contraseña puede acceder al contenido.

Las contraseñas son individuales para cada página / entrada. Por tanto, deberás configurar una contraseña para cada una. ¿Cómo afecta esto al usuario que visita estas páginas? Que cada vez que accedan a una de esas páginas deberá introducir la contraseña. Eso sí, si en dos páginas se configura la misma contraseña, el usuario solo deberá introducirla una vez, y podrá acceder a las dos páginas.

Eso sí, esta opción solo es viable si tienes una o dos páginas que te gustaría ocultar al público en general. Si tiene bastantes artículos o páginas para proteger, tendrás que mantener y distribuir tantas contraseñas como páginas a ocultar con los lectores seleccionados.

Otro aspecto a tener en cuenta con este método es que, si un usuario encuentra dicho contenido verá una pantalla que solicita una contraseña. Si no quieres que las personas que no tienen acceso  conozcan de su existencia, entonces, este método no servirá.

La siguiente captura de pantalla muestra un ejemplo de página protegida con contraseña:

Ejemplo de página protegida con contraseña en WordPress

Además, la protección con contraseña de una página no elimina esa página del sitio web si no tiene permiso para verla. En su lugar, la palabra «Protegido:» se agrega al comienzo del título, que tiene sus usos, pero no es ideal si no desea que las personas sepan que hay contenido privado en el sitio web.

2(c).- Marcar páginas / publicaciones privadas

Las páginas privadas no requieren contraseñas individuales para desbloquear. El acceso a estas se concede tras loguearse en la zona de administración de WordPress y verificar el rol del usuario. Por lo general, solo los administradores del sitio o los editores pueden ver dichas páginas privadas.

Así es como se ve una página marcada como privada:

Cómo se muestra una página privada a un usuario sin acceso

La otra gran diferencia entre las páginas protegidas con contraseña y las privadas es que si no tienes los privilegios suficientes para ver una página, entonces no se mostrará en el sitio web en ninguna parte. Especialmente útil si no quieres que cualquier visitante sepa qué contenido adicional hay en nuestra web.

Además, de las dos opciones, la configuración de visibilidad privada tendría más sentido si deseas restringir el acceso a una gran cantidad de contenido en tu web.

El principal inconveniente de este método es que solo los usuarios con el rol Administrador y el rol Editor pueden ver el contenido privado, y como es obvio en estos casos, no es viable dar acceso de administrador o editor a cada usuario que deba acceder a estas páginas de la web. ¿Solución? Añadir otro nivel de rol a tu web, o dar los permisos suficientes a un rol existente, por ejemplo, suscriptor. De esta forma, todos los usuarios de tu web con el nuevo rol, o el rol suscriptor modificado, podrán acceder al contenido restringido.

Por tanto, podríamos construir un área de miembros sencilla otorgando al rol suscriptor el permiso necesario para ver páginas y entradas privadas, agregando una nueva función al archivo functions.php en tu tema:

/**
 * Añadimos capacidades de lectura al rol suscriptor
 */
function agm_nuevas_caps_suscriptor()
{
    global $wp_roles;
    $role = get_role('subscriber');
    $role->add_cap('read_private_pages');
    $role->add_cap('read_private_posts');
}

add_action ( 'admin_init', 'agm_nuevas_caps_suscriptor' );

Lo que hace este fragmento de código es, únicamente, cambiar las capacidades (permisos) asignadas al rol de Suscriptor para incluir la capacidad de leer entradas y páginas privadas. Ten en cuenta que la función add_cap es una acción de una sola vez (el cambio realizado se almacena en la base de datos); por ello, es conveniente comentar el código después de que se haya aplicado el cambio. Échale un ojo a las indicaciones del Codex sobre add_cap. Además, si deseas eliminar esta capacidad después, deberás cambiarlo usando la función remove_cap en su lugar.

Si tocar código no es lo tuyo, puedes usar el plugin User Role Editor, el cuál te permitirá otorgar este permiso al rol suscriptor, o incluso, si lo prefieres, crear un rol nuevo con los permisos necesarios.

Ahora que tu área de miembros está lista, es el momento de indicar cuál es el inicio de sesión a los suscriptores, que podrán acceder a través del enlace tupaginaweb.com/wp-login.php.

Por último, si quieres redireccionar a los usuarios a una página concreta de la web una vez se hayan logueado, puedes hacer uso del siguiente código:

/**
 * Redireccionamos al rol suscriptor a la home
 */
function redireccion_afterlogin_suscriptor( $redirect_to, $request, $user )
{ 
    // ¿Hay usuario a verificar?
    if ( isset( $user->roles ) && is_array( $user->roles ) ) {
 
        // ¿Tiene rol suscriptor? Si: Redirigimos
        if ( in_array( 'subscriber', $user->roles ) ) {
 
            /* Si es suscriptor (nuestro rol usado para lectores de páginas
            y entradas privadas), le redirigimos a la página home.
            También podríamos redirigirle a una página concreta */
            return home_url();
        } else {
 
            // Si no es suscriptor, redirigimos al lugar por defecto
            return $redirect_to;
        }
    } else {
        return $redirect_to;
    }
}
 
add_filter( 'login_redirect', 'redireccion_afterlogin_suscriptor', 10, 3 );

Tras leer este artículo espero que, como mínimo, hayas aprendido un poco mejor el funcionamiento de WordPress. A veces, tiene más funciones de las que imaginamos, y solo con un par de retoques podremos adaptarlas a nuestras necesidades.


Comentarios

6 respuestas a «Cómo hacer de nuestro WordPress un área privada » sin plugins»

  1. Avatar de gabriel
    gabriel

    hola que tal? mi duda es la siguiente: el código sirve para que cada usuario SOLAMENTE vea sus propias entradas? sin poder ver las entradas de los demás usuarios creados, ni borradores de otros.
    No sé si me explico bien, mi idea es que cada suscriptor solamente vea lo que uno crea, ya lo hice con las multimedias, cada usuario solamente puede ver sus imágenes cargadas.
    En fin, estoy usando un plugin para quitarle accesos a mis suscriptores, les quito el permiso de que puedan editar y ver las demás entradas de los suscriptores pero así y todo siguen apareciendo en «todas las entradas».

    1. Avatar de agmialdea
      agmialdea

      ¡Hola Gabriel! Los suscriptores no deberían poder ver ninguna entrada (las capacidades por defecto de un suscriptor no le permiten ver, editar ni crear entradas); quizá sea por que les hayas otorgado más capacidades al rol suscriptor. Si te fijas, en el punto 2(c) lo que hemos hecho con ese código es otorgarle la capacidad de ver entradas y páginas privadas, pero no de crearlas, por tanto, no existirán páginas o entradas propias, pues no serán autor de ninguna. ¿Es un rol suscriptor lo que necesitas? Quizá un rol autor te sería más conveniente.

  2. Hola! Me viene muy bien la opción 1!

  3. ¡Hola! Creo que es el tutorial que se acerca más a lo que estaba buscando, pero si estoy buscando que retorne a una página específica (por ejemplo: ‘socio’), ¿podría cambiar la ubicación de ‘home_url()’ a ‘socio.php’ o cómo sería la sintaxis(www.miweb.com/socio)?

    1. Avatar de agmialdea
      agmialdea

      Hola Rebeca! En ese caso podríamos hacer algo como:
      return home_url( ‘/socio/’ );

  4. Avatar de Guillermo
    Guillermo

    Éres un máquina!! Funciona a la perfección. 🙂

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.