Cómo crear una sección privada para nuestros usuarios

Proteger una categoría de WordPress con nombre de usuario y contraseña

Proteger contenido WordPress con contraseñaWordPress permite proteger fácilmente nuestras páginas y entradas con contraseña, pero no es posible (al menos sin utilizar algún plugin que probablemente añada otras 100 funciones más que no necesitamos) bloquear el acceso a toda una categoría y proteger así todas las entradas que contiene.

Aunque protejamos todas las entradas de una categoría determinada con contraseña, al visitar la página de archivo de esa categoría seguirán apareciendo los títulos, y eso a veces también se quiere evitar.

La opción que tendría más sentido en este caso sería publicar las entradas como «privadas», para ocultar completamente el contenido y que no sean visibles en la parte pública de la web más que para los usuarios que tengan permisos suficientes. Pero esto supone tener que crear usuarios de WordPress, darles permisos (por defecto, de editor o administrador) y explicarles cómo acceder al sistema.

Una solución intermedia perfecta sería proteger una categoría con contraseña: permitiría un acceso fácil y rápido a cualquier visita, la contraseña podría ser única para todos y, además, al publicar contenido sólo tendríamos que guardarlo en esta nueva categoría protegida.

Soluciones

La primera solución que viene a la mente es proteger el directorio a nivel de servidor, ya sea a través de las opciones del gestor (cPanel, Plesk, etc.), o bien añadiendo directamente los archivos .htaccess y .htpasswd dentro de la carpeta que se corresponde con la categoría que queremos proteger. Por ejemplo, si la categoría se llamara «privado», crearíamos una carpeta nueva en la raiz de la instalación de WordPress con el mismo nombre.

Pero el problema es que el directorio es virtual (la carpeta «/privado/» no existe en realidad), y en WordPress los directorios reales tienen preferencia sobre los virtuales. Es decir, si creamos una carpeta llamada igual que la categoría, la protección funcionará correctamente, pero nos aparecerá el mensaje «Forbidden, You don’t have permission to access /privado/ on this server«, simplemente porque WordPress no ha podido hacer la reescritura de la URL correctamente, y además no existe ningún archivo dentro de esa carpeta.

Si no podemos crear directorios que coincidan con las URLs que gestiona WordPress a través del módulo mod_rewrite, hay que buscar otra solución, a ser posible, que no suponga editar la configuración de Apache.

Proteger con contraseña un directorio virtual con htaccess y htpasswd

Como se trata de un directorio virtual, cualquier retoque que hagamos tiene que ocurrir antes de que entre en acción la redirección de URLs de WordPress. Para ello podemos utilizar el módulo mod_setenvif de Apache en el archivo htaccess principal.

Lo primero de todo conviene hacer una copia de seguridad del archivo htaccess que vamos a modificar, ya que es muy sensible a los errores y cualquier cosa de más o de menos hará que la web deje de funcionar.

A continuación editamos el archivo añadiendo un bloque que incluya estas reglas (si copias y pegas, ten en cuenta que hay que editar algunas cosas para que funcione):

# --------------------------------
# Protección con contraseña
# de categoría y entradas
# --------------------------------
SetEnvIfNoCase Request_URI "^/categoria/privado" SECURED
SetEnvIfNoCase Request_URI "^/privado" SECURED
AuthType Basic
AuthName "Acceso restringido"
AuthUserFile /var/www/vhosts/midominio.com/httpdocs/.htpasswd
Require valid-user
Satisfy any
Order allow,deny
Allow from all
Deny from env=SECURED

En las dos primeras lineas (lineas 5 y 6 del ejemplo anterior) especificamos lo que queremos proteger. En este caso queremos bloquear dos cosas: el acceso a la página de la categoría y también el acceso a las entradas guardadas dentro de esa categoría (que empezarán con «/privado/…» o con el nombre que le hayamos dado). Si tenemos que bloquear el acceso a otras páginas podemos añadir más lineas como las anteriores.

Después tenemos que definir (en la linea 9) la ruta al archivo «.htpasswd», que contendrá los nombres de los usuarios y las contraseñas (cifradas con MD5) con este formato:

usuario:contraseña-MD5
otrousuario:otracontraseña-MD5

Para crear este archivo podemos utilizar este generador de contraseñas para htpasswd, donde sólo hay que introducir el nombre de usuario y la clave que queremos utilizar. La herramienta nos generará el formato correcto y cifrará automáticamente la contraseña utilizando MD5.

Al subir estos dos archivos (htaccess y htpasswd) al servidor, si todo ha ido bien, el navegador nos mostrará un cuadro con el mensaje «Se requiere autenticación» y la opción de añadir el nombre de usuario y la contraseña cuando visitemos alguna de las direcciones especificadas más arriba.

Pero falta un paso más: excluir la categoría privada del canal de actualizaciones RSS.

Cómo excluir la categoría del feed RSS

Para hacer nuestra categoría protegida un poco más privada, habrá que evitar que se publique en las actualizaciones del feed RSS que WordPress genera por defecto, excluyéndola de la consulta principal.

Para ello podemos incluir esta función en el archivo functions.php, especificando el ID de la categoría que vamos a eliminar:

// ---------------------------------------------------
// Excluimos la categoria "Privado" del feed RSS
// ---------------------------------------------------
function new_filter_feed($query) {
    if ( $query->is_feed ) {
        $query->set( 'cat', '-25' ); // Si son varias: ( 'cat', '-25, -30, -35' );
    }
	return $query;
}
add_filter( 'pre_get_posts','new_filter_feed' );

Conclusión

Posiblemente las futuras versiones de WordPress incluyan la opción de proteger categorías con contraseña y no haya que seguir todo este proceso para conseguirlo, aunque la verdad es que es poco probable, porque esto añadiría complejidad al sistema y tal vez no sea una de las funciones más demandadas.

Lo que es seguro es que, si montas webs para clientes, en algún momento te van a pedir que consigas ampliar las funciones de WordPress para que el contenido sea un poco menos público.

Comentarios

¿Y tú qué opinas?

Las URLs se convertirán en enlaces automáticamente. Tu dirección de email no se publicará ni se utilizará para enviar ningún tipo de información. Los mensajes que no aporten nada al tema que se trata en esta entrada se borrarán. Las imágenes que aparecen al lado de cada autor utilizan el servicio de Gravatar. Recuerda que puedes usar etiquetas HTML como <a href>, <code>, <em> o <strong> en los comentarios.

(necesario)

(opcional)

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