Restringiendo el acceso a la información de nuestra web o blog
Cómo proteger entradas o páginas con contraseña en WordPress

WordPress permite desde hace tiempo proteger fácilmente nuestra información privada bajo contraseña. Cualquier entrada o página de nuestra web o blog puede ser publicada para que solamente algunos usuarios tengan acceso.
Para publicar un contenido protegido por contraseña:
- Desde el editor de páginas o entradas de WordPress tenemos que pulsar el botón “Editar” que hay junto a la opción “Visibilidad: Público”, seleccionar “Protegida con contraseña” y después pulsar el botón “Aceptar” (ver imagen). También se puede cambiar o editar la contraseña desde la edición rápida.
- Después solo tenemos que pulsar el botón “Publicar”. A partir de ese momento nuestra información solo estará disponible para aquellos a quienes hayamos facilitado la contraseña del primer paso.
Por defecto WordPress añade automáticamente la palabra “Protegido” (o “Protected”, si no la hemos traducido) al título de nuestra entrada o página. Para eliminar esta palabra y dejar el título tal como lo hemos publicado, tendremos que hacer algo más:
- Abrir el archivo
functions.php(si nuestra plantilla no lo tiene, lo creamos) - Añadir este fragmento de código:
// Cambiando el título de los posts protegidos con contraseña: add_filter('the_title','entradas_protegidas'); function entradas_protegidas($title) { return str_replace('Protegido:','', $title); }Con esto lo que hacemos es añadir un filtro al título para que sustituya la palabra “Protegido” por “”, es decir, por nada. Si lo que queremos es sustituirla por otra palabra, solo tenemos que escribirlo entre las comillas. Por ejemplo:
// Cambiando el título de los posts protegidos con contraseña: add_filter('the_title','entradas_protegidas'); function entradas_protegidas($title) { return str_replace('Protegido:','Acceso restringido:', $title); }En caso de que estemos montando una web en varios idiomas, o que necesitemos sustituir varias palabras, por ejemplo “Protegido” y “Privado”, podemos usar una función más completa:
// Sustitución de varias palabras en los títulos function titulo_entradas_protegidas($title){ $pattern[0] = '/Protected:/'; $pattern[1] = '/Private:/'; $pattern[2] = '/Protegido:/'; $pattern[3] = '/Privado:/'; $replacement[0] = ''; // Texto con el que sustituir 'Protected:' $replacement[1] = ''; // Texto con el que sustituir 'Private:' $replacement[2] = ''; // Texto con el que sustituir 'Protegido:' $replacement[3] = ''; // Texto con el que sustituir 'Privado:' return preg_replace($pattern, $replacement, $title); } add_filter('the_title', 'titulo_entradas_protegidas');
Este método protege dos bloques de información: el contenido (the_content) y los comentarios (comments_template).
¿Qué diferencia hay entre “Protegida con contraseña” y “Privada”?
Cualquiera de estas dos opciones protege nuestra información, pero hay una diferencia importante: al marcar una entrada o página como privada, ésta desaparece completamente, es decir, la visibilidad para el visitante es nula, mientras que si la protegemos con contraseña lo único que ocultamos es el contenido (pero no el título).
Por defecto, el contenido privado en WordPress solo es visible para administradores y editores. Cualquier rol con menos privilegios carece de la posibilidad de visualizar (y mucho menos editar) esta información.
Más información: Using Password Protection
Cómo modificar el formulario de protección con contraseña
WordPress, al menos hasta la versión 3.1.3, no nos ofrece ninguna clase especial para dar estilo a este formulario (algo un poco extraño ya que una simple clase en el body nos permitiría acceder a él mediante reglas CSS). Para poder editar este formulario, lo mejor es recrear la función en nuestro archivo functions.php:
add_filter('the_password_form', 'nuevo_formulario');
function nuevo_formulario() {
global $post;
$label = 'pwbox-'.(empty($post->ID) ? rand() : $post->ID );
$output = '<form class="formulario-contrasena" action="' . get_option('siteurl') . '/wp-pass.php" method="post">' . __("<p><strong>Esta información está protegida.</strong><br />Por favor, para verla escribe la contraseña a continuación:</p>") . '<p><input name="post_password" id="' . $label . '" type="password" size="25" /><input type="submit" name="Submit" value="' . esc_attr__("Submit") . '" /></p></form>';
return $output;
}
Nota: a partir de la versión 3.4, WordPress deja de utilizar el archivo “wp-pass.php”, por lo que el código anterior no funcionará. Para que funcione correctamente en las versiones más recientes del sistema, tenemos que sustituir la referencia a “wp-pass.php” por “wp-login.php?action=postpass” (Más información: Sin acceso a entradas o páginas protegidas por contraseña tras actualizar a WordPress 3.4)
Proteger con contraseña una web completa
Hasta el momento WordPress tampoco ofrece la posibilidad de proteger toda una web con contraseña, aunque es posible que forme parte de las opciones del sistema en futuras versiones. De todas formas, hasta que esto ocurra, afortunadamente existen numerosos plugins que facilitan mucho el tema:
- Page Restrict: acceso restringido para páginas o entradas seleccionadas
- Restricted Site Access: acceso limitado a usuarios registrados o a determinadas direcciones IP
- Registered Users Only: obliga a todos los visitantes a identificarse para poder acceder a la web
También podemos restringir el acceso a nuestra web mediante .htaccess. Un simple ejemplo:
RewriteEngine on
RewriteCond %{REQUEST_URI} !/acceso-restringido.php$
RewriteCond %{REMOTE_ADDR} !^80\.31\.190\.52
RewriteCond %{HTTP_REFERER} !^http://www.miweb.com/ [NC]
RewriteCond %{HTTP_REFERER} !^http://miweb.com/ [NC]
RewriteRule $ /acceso-restringido.php [R=302,L]
Así, cualquier usuario que visite nuestra web y no tenga la IP del ejemplo será redireccionado a la página “acceso-restringido.php”.
Más información:
- WordPress content visibility (en inglés)
- Password Protect More Than the_content() (en inglés)
|
Permalink
Muy interesante el post, sobre todo el apartado de los Plugins. Una información que me llega muy oportunamente.
¿Sabes si Page Restrict bloquea también las sub-páginas?
Saludos
Permalink
Muchas gracias. Sí, Page Restrict protege tanto los posts como las páginas y subpáginas (child pages). Solo hay que decirle cuáles queremos hacer que sean privadas.
Permalink
Muy buen artículo, y muy didáctico
Permalink
Daniel se ve que eres un experto en el tema, me ha venido fenomenal para mi blog. Muchas gracias. A partir de ahora seré asiduo a tu blog.
Permalink
Hola,
tengo un problema y es que la segunda vez que accedo a la página no me muestra la parte de insertar la contraseña….
Gracias!!!
Permalink
Solucionado
en el archivo wp-pass.php
// 10 days
setcookie(‘wp-postpass_’ . COOKIEHASH, stripslashes( $_POST['post_password'] ), time() + 8, COOKIEPATH);
Permalink
Gracias por la excelente info
Permalink
Buenísimo el post, muy útil. Una cosa, una vez que tenemos protegida la entrada con una contraseña, ¿puedo vincular el user y password de un subscriptor con esta protección?
Me explico, estoy con una web para una Comunidad de vecinos en la cual el apartado “noticias” está cerrado al público en general, tan solo para esos vecinos y necesito que los mensajes del administrador de la Comunidad (las entradas de la página) una vez subidas sean notificadas por mail.
Permalink
En ese caso, en vez de proteger cada entrada con una contraseña, creo que sería mejor solución limitar la visibilidad de esas entradas a ciertos usuarios.
Aquí encontrarás algunas ideas para conseguirlo: http://www.danielnabil.com/blog/mostrar-contenidos-wordpress-usuarios-conectados/
Permalink
Saludos Daniel. Excelente información. Solo tengo una duda. ¿Cómo puedo hacer para que el navegador me pida nuevamente la contraseña? Es decir, la contraseña una vez introducida no me la vuelve a pedir. De antemano, muchas gracias.
Permalink
Las contraseñas de las entradas quedan almacenadas en una cookie en el navegador durante 10 días. Para que vuelva a pedirla (útil por ejemplo, si estamos en un ordenador compartido) basta borrar esta cookie.
El proceso en Google Chrome sería así:
1. Entrar en la configuración del navegador
2. Mostrar opciones avanzadas (abajo del todo)
3. Privacidad > Configuración del contenido
4. Todas las cookies y los datos de sitios
5. Buscar cookies (escribir el nombre del dominio)
6. Buscar la cookie “wp-postpass…”
7. Eliminar
El mismo proceso en Firefox:
1. Editar las opciones
2. Privacidad
3. Eliminar cookies de forma individual
4. Buscar (introducir el nombre del dominio)
5. Seleccionar la cookie que empieza con “wp-postpass…”
6. Eliminar cookie
Si aun así el navegador sigue recordando la contraseña es porque le dijimos que la guardara al introducirla por primera vez. En este caso habrá que editar la gestión de contraseñas y borrarla.
Permalink
Pregunta ¿Conocés algún pluging de acceso restringido individual? Es decir, que cada usuario pueda acceder a un contenido distinto, en realidad solo seria acceder o bajar uno o mas pdf, que son en verdad polizas de seguro muy parecidas entre sí y sencillas pero con los datos de cada usuario que difieren.
Permalink
@Silvana:
Si no hay muchos usuarios o cambios de archivos, se podría hacer manualmente con condicionales, por ejemplo, seleccionando el ID de cada usuario:
if ( 2 == $user_id )…
Aquí tienes varios ejemplos de condicionales que podrían servir:
http://www.danielnabil.com/blog/mostrar-contenidos-wordpress-usuarios-conectados/
También hay plugins que te permiten seleccionar el usuario por su nombre, rol, etc. y mostrar el contenido dependiendo de esa selección. Básicamente sería lo mismo que antes, pero sin tener que editar manualmente las plantillas.
User specific content:
http://wordpress.org/extend/plugins/user-specific-content/