Cómo crear una sección privada para nuestros usuarios
Proteger una categorÃa de WordPress con nombre de usuario y contraseña
WordPress 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