Restringiendo el acceso a la información de nuestra web o blog

Cómo proteger entradas o páginas con contraseña en WordPress

Opciones de WordPress: proteger con contraseña

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:

  1. 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.
  2. 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:

  1. Abrir el archivo functions.php (si nuestra plantilla no lo tiene, lo creamos)
  2. 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

Entrada relacionada: Cómo proteger una categoría de WordPress con nombre de usuario y contraseña

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)

Cómo eliminar la cookie de WordPress o añadir un botón para cerrar sesión en páginas protegidas por contraseña

Al proteger nuestro contenido con una contraseña, el sistema generará una cookie (un pequeño archivo con información) que queda guardada en el ordenador del usuario durante algún tiempo (10 días, concretamente), hasta que expira, y entonces se le vuelve a pedir la contraseña.

Si necesitamos que la sesión dure un tiempo determinado, o bien que el usuario la pueda cerrar manualmente, podemos hacer varias cosas:

  1. Borrar manualmente la cookie guardada en el navegador
  2. Acceder al código interno de WordPress y editar la función que define la cookie
  3. Crear un botón (un enlace) para que el usuario pueda desconectarse (borrar la cookie) fácilmente a través de un plugin

Para aprender a hacer esto, consulta esta otra página:
Cómo eliminar la cookie de WordPress o añadir un botón para cerrar sesión en páginas protegidas por contraseña

Redireccionar a los usuarios no registrados a la página de acceso

Como alternativa, en vez de pedir una contraseña podemos evitar que se acceda a una página (o a varias) utilizando el condicional is_user_logged_in. Este código evitará que se cargue la página a no ser que el visitante sea un usuario registrado en el sistema:

// Si el usuario no está registrado
if ( ! is_user_logged_in() ) {
	wp_redirect( wp_login_url() );
	exit;
}

Cómo proteger otros elementos de la página

Si además de proteger el contenido principal de una página necesitamos ocultar tras una contraseña otros elementos secundarios, como barras laterales, campos personalizados (custom fields), comentarios o cualquier otro bloque de información, desde la versión 2.7 de WordPress podemos utilizar la función post_password_required() junto con el resto de condicionales en las plantillas.

Lo que hace esta función es verificar que se ha introducido una contraseña correcta antes de mostrar el contenido. Por ejemplo:

<?php if ( is_page(4) && !post_password_required() ) : ?>
Barra lateral oculta con contraseña en la página con ID=4
<?php else : ?>
Barra lateral sin protección, disponible para todos los usuarios
<?php endif; ?>

En este otro artículo encontrarás información sobre cómo ocultar páginas y entradas en el area de administración, para evitar miradas curiosas o ediciones accidentales.

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 bastantes plugins que facilitan mucho este 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
  • Password Protected: una manera sencilla y rápida de proteger todo un sitio web con una única contraseña, con opciones para permitir acceso al feed o acceso abierto para administradores

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».

Cerrar la web temporalmente por mantenimiento

Con esta función podemos cerrar temporalmente la web a todos los visitantes, útil por ejemplo si estamos haciendo tareas de mantenimiento. La web seguirá estando disponible para usuarios administradores, mientras que el resto de visitas se encontrarán con la web bloqueada y con una nota de aviso.

En este caso, enviamos una respuesta HTTP 503 (recurso no disponible temporalmente), así también los buscadores sabrán que no hemos cerrado la web definitivamente y que sólo se trata de un bloqueo momentáneo.

Para activarlo podemos añadir esta función en el archivo «functions.php» del tema que tengamos activo. Lo único que hace es verificar si el usuario está conectado y si tiene permisos para editar la plantilla. En caso negativo, activa la función wp_die con el mensaje que queremos mostrar y el tipo de respuesta que vamos a enviar:

// Mantenimiento temporal (Error 503: Recurso no disponible temporalmente)
function theme_maintenance_mode() {
    if ( !current_user_can('edit_themes') || !is_user_logged_in() ) {
        wp_die(
        	'Estamos haciendo tareas de mantenimiento. Por favor, vuelve pasados unos minutos', // Mensaje de aviso
        	'Modo mantenimiento activado', // Título de la página
        	array('response' => '503') // Código de estado HTTP
        	);
    }
}
add_action('get_header', 'theme_maintenance_mode');

Al terminar de realizar las tareas de mantenimiento, basta eliminar o comentar esta función y la web volverá a mostrarse normalmente.

Plugins relacionados

  • Restrict Content Pro (Premium Membership Plugin): Completo sistema de gestión de socios/miembros, suscripciones y contenido restringido. Permite crear niveles (gratuito, prueba y premium), seguimiento de pagos, ofrecer descuentos y contenidos privados solo para suscriptores.
    URL: http://pippinsplugins.com/restrict-content-pro-premium-content-plugin/
  • Optional Content: Mostrar u ocultar contenido de manera condicional en una página o post (basado en shortcodes). Es decir, nos permite restringir el acceso de fragmentos de una entrada o página a un tipo de usuario.
    URL: http://wordpress.org/extend/plugins/optional-content/

Más información:

Comentarios

Responder a mg Cancelar la respuesta

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.