Proteger con contraseña una página en WordPress

12 oct 2011, 18:33:06
Vistas: 15.5K
Votos: 7

Estoy intentando proteger con contraseña una página pero no parece estar funcionando. He establecido la contraseña para la página pero cuando navegas a ella se carga normalmente sin pedir contraseña.

Este es el loop que tengo en mi página:

<?php
/**
 * @package WordPress
 * @subpackage Default_Theme
 * Template Name: Page
 */

get_header(); ?>

<?php
global $post;
if ( post_password_required( $post ) ) {
?>

<?php $fields = get_acf(); ?>

<script type="text/javascript"> 
(function() { 

window.onload = function() { 

...

}}
) 
</script> 
<div id="map"></div>

<?php } else { ?>
    Not passworded

    <?php if (have_posts()) : ?>
        <?php while (have_posts()) : the_post(); ?>

        <?php endwhile; ?>
    <?php endif; ?>

    <? 
    } // Page isn't password-protected
    ?>
<?php get_footer(); ?>

Quiero proteger con contraseña todo el contenido dentro de la página.

UPDATE:

Tengo contenido personalizado en la página así que si es posible necesito poder envolver algún código alrededor de todo.

Update: Imagen de ejemplo

6
Comentarios

¿Qué significa 'se carga normalmente'? ¿Y qué es 'todo dentro de la página'? ¿Ocurre lo mismo si estás desconectado?

Michael Michael
13 oct 2011 00:08:48

@Michael Si escribo la dirección de la página, se carga sin pedir contraseñas, etc. He cerrado sesión en el administrador de WP y lo he intentado, pero sigue ocurriendo lo mismo.

Rob Rob
13 oct 2011 11:46:37

¿Puedes proporcionar el contenido completo (en lugar de solo el Loop) del archivo de plantilla relevante para esta Página protegida con contraseña?

Chip Bennett Chip Bennett
1 nov 2011 19:01:44

@ChipBennett Sería más fácil ver el código fuente de http://www.mediwales.com/mapping/members. Aparte del bucle que publiqué, el resto es visible en el código fuente.

Rob Rob
1 nov 2011 19:04:17

@Rob eso no ayuda. PHP no es visible en el código fuente del navegador, ya que ya ha sido interpretado y renderizado en HTML. Necesitamos ver el código fuente PHP, no el HTML renderizado.

Chip Bennett Chip Bennett
1 nov 2011 19:05:33

@Rob, mira la respuesta de Chip Bennet abajo, tiene razón. El problema es que no tienes un formulario en tu página. Cuando proteges con contraseña una publicación en WordPress, ya sea un tipo de publicación personalizado, necesitas tener un formulario dentro de la plantilla que proteja el contenido que no quieres que se vea. Si quieres proteger toda la página, la protección por contraseña en el administrador no es la forma de hacerlo.

eileencodes eileencodes
1 nov 2011 19:54:26
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 4
15
14

Una solución sería crear una plantilla de Página personalizada para las páginas que deseas proteger con contraseña.

Comienza creando tu plantilla de Página personalizada, quizás llamada template-password-protected.php, y agrega la etiqueta Template: en el bloque de comentarios al inicio, así:

<?php
/**
 * Plantilla: Protegida por contraseña
 */
?>

Ahora, añade el marcado básico de tu plantilla de Página:

<?php
/**
 * Plantilla: Protegida por contraseña
 */
?>

<?php get_header(); ?>

<div id="main">

<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>

        <div id="map" style="width:100%; height:100%"></div>

    <?php endwhile; ?>
<?php endif; ?>

</div>

<?php get_sidebar(); ?>

<?php get_footer(); ?>

Ahora, modifícala para que muestre contenido predeterminado si la página está protegida por contraseña:

<?php
/**
 * Plantilla: Protegida por contraseña
 */
?>

<?php get_header(); ?>

<div id="main">

<?php
// Globalizar $post
global $post;
// Comprobar si la página está protegida por contraseña
// Devuelve true si el post está protegido por contraseña
// y si la contraseña no coincide con la cookie
if ( post_password_required( $post ) ) {
    ?>
    <p>
    CONTENIDO PERSONALIZADO QUE SE MUESTRA SOLO CUANDO LA PÁGINA ESTÁ PROTEGIDA POR CONTRASEÑA
    VA AQUÍ
    </p>
    <?php
} else { 
    // La página no está protegida por contraseña
    ?>

<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>

        <div id="map" style="width:100%; height:100%"></div>

    <?php endwhile; ?>
<?php endif; ?>

<?php } ?>

</div>

<?php get_sidebar(); ?>

<?php get_footer(); ?>

EDICIÓN

Basado en este comentario:

Esto no parece funcionar, mi página se carga normalmente tanto si estoy conectado como si no.

Sospecho que en lugar de proteger con contraseña las Páginas, en realidad quieres que las Páginas sean visibles solo para usuarios conectados? (Nota: estos dos conceptos son cosas completamente separadas en WordPress.)

Entonces, asumiendo eso, querrías usar is_user_logged_in(), en lugar de post_password_required().

Aquí hay un ejemplo de plantilla de Página personalizada basada en is_user_logged_in():

<?php
/**
 * Plantilla: Requiere inicio de sesión
 */
?>

<?php get_header(); ?>

<div id="main">

<?php
// Globalizar $post
global $post;
// Comprobar si el usuario está conectado
// Devuelve true si el usuario no está conectado
if ( ! is_user_logged_in() ) {
    ?>
    <p>
    CONTENIDO PERSONALIZADO QUE SE MUESTRA SOLO CUANDO EL USUARIO NO ESTÁ CONECTADO
    VA AQUÍ
    </p>
    <?php
} else { 
    // El usuario está conectado
    ?>

<?php if (have_posts()) : ?>
    <?php while (have_posts()) : the_post(); ?>

        <div id="map" style="width:100%; height:100%"></div>

    <?php endwhile; ?>
<?php endif; ?>

<?php } ?>

</div>

<?php get_sidebar(); ?>

<?php get_footer(); ?>

Para resumir:

  1. Entrada/Página Protegida por Contraseña

    Aplica una contraseña por entrada/página que los usuarios deben ingresar para ver el contenido. Esta contraseña se establece en la pantalla de edición de la entrada, y utiliza la interfaz proporcionada en esa pantalla para marcar la entrada como protegida por contraseña. El contenido dentro del Loop se protege automáticamente según esta configuración por entrada.

    Del Codex:

    Proteger esta entrada con contraseña

    Para proteger una entrada con contraseña, haz clic en Editar junto a Visibilidad en el área de Publicación en la parte superior derecha, luego haz clic en Protegida por contraseña, haz clic en Aceptar e ingresa una contraseña. Luego haz clic en Aceptar. Nota - Los usuarios Editor y Administrador pueden ver entradas protegidas por contraseña o privadas en la vista de edición sin conocer la contraseña.

  2. Entrada/Página Protegida por Inicio de Sesión

    Completamente separado de proteger con contraseña una entrada/página. Requiere envolver el contenido en un condicional is_user_logged_in(), y no usa ni requiere una contraseña por entrada.

EDICIÓN 2

Al ver tu código, tengo que preguntar: ¿pretendes mostrar este mapa en páginas protegidas por contraseña? Porque eso es lo que tu código está indicando:

<?php
global $post;
if ( post_password_required( $post ) ) {
?>

<?php $fields = get_acf(); ?>

<script type="text/javascript"> 
(function() { 

window.onload = function() { 

...

}}
) 
</script> 
<div id="map"></div>

Este marcado dice: si se requiere la contraseña de la entrada, muestra este mapa de javascript.

¿Supongo que eso es lo contrario de lo que quieres?

Prueba esto en su lugar:

<?php
/**
 * @package WordPress
 * @subpackage Default_Theme
 * Plantilla: Página
 */

get_header(); ?>

<?php
global $post;
if ( post_password_required( $post ) ) {
?>
<p>ESTA ENTRADA ESTÁ PROTEGIDA POR CONTRASEÑA. POR FAVOR, INGRESA LA CONTRASEÑA PARA VER ESTA ENTRADA.</p>

<?php 
} else { 
// No se requiere contraseña, o se ha ingresado la contraseña
?>


<?php $fields = get_acf(); ?>

<script type="text/javascript"> 
(function() { 

window.onload = function() { 

...

}}
) 
</script> 
<div id="map"></div>
1 nov 2011 19:30:42
Comentarios

Entiendo todo excepto una parte de tu respuesta, ¿qué significa "y agregar la etiqueta Template: file-docblock"?

Rob Rob
2 nov 2011 13:06:32

"¿qué significa "y agregar la etiqueta Template: file-docblock"?" - Consulta la entrada del Codex para crear plantillas de Página personalizadas. Editaré mi respuesta para aclarar esa parte.

Chip Bennett Chip Bennett
2 nov 2011 15:31:19

Ah, claro, simplemente no sabía que se llamaba así.

Rob Rob
2 nov 2011 15:42:08

He actualizado mi respuesta basándome en tu comentario a @sanchothefat anteriormente.

Chip Bennett Chip Bennett
2 nov 2011 16:41:09

Gracias, ahora lo entiendo. Al probar tu primer método me aparece este error - Parse error: syntax error, unexpected '{' in /home/medicom/public_html/mapping/wp-content/themes/default/page.php on line 16 la línea 16 es if ( post_password_required( $post ) {

Rob Rob
2 nov 2011 16:54:54

Falta el paréntesis de cierre. Cambia esto: if ( post_password_required( $post ) { ...por esto: if ( post_password_required( $post ) ) {

Chip Bennett Chip Bennett
2 nov 2011 16:57:32

Ok, esta es la página en la que estoy trabajando - http://www.mediwales.com/mapping/members/. Probé el primer método, protegí la página con contraseña, puse el contenido dentro de la parte protegida pero todo simplemente se carga. No hay solicitud de contraseña.

Rob Rob
2 nov 2011 17:04:42

¿Estás seguro de que protejiste la página con contraseña?

Chip Bennett Chip Bennett
2 nov 2011 17:09:38

Y, en serio: ¿podemos ver todo el marcado PHP de tu página?? En este punto, la pregunta será imposible de diagnosticar/resolver sin ver tu código real.

Chip Bennett Chip Bennett
2 nov 2011 17:10:14

Ver pregunta actualizada

Rob Rob
2 nov 2011 17:13:26

Ver respuesta actualizada. :)

Chip Bennett Chip Bennett
2 nov 2011 17:30:50

Ok gracias. Acabo de probar eso. Quiero que el mapa se muestre cuando se ingresa una contraseña (es decir, esa es la parte protegida), ¿dónde ingresaría una contraseña para ver el contenido?

Rob Rob
2 nov 2011 17:41:45

Necesitarás agregar una llamada a get_the_password_form(). Consulta el EDIT 3 en la respuesta actualizada.

Chip Bennett Chip Bennett
2 nov 2011 17:53:29

Perfecto. Hay un error ortográfico al llamar al formulario (no tengo suficientes privilegios para corregirlo). Espero que una respuesta tan completa ayude a otros, ya que no hay mucha información sobre este tema. Gracias de nuevo.

Rob Rob
2 nov 2011 17:57:51

"Hay un error ortográfico al llamar al formulario (no tengo suficientes privilegios para corregirlo)" - ¡ups! Ya está corregido. Gracias por señalarlo.

Chip Bennett Chip Bennett
2 nov 2011 18:01:36
Mostrar los 10 comentarios restantes
3

Utiliza la siguiente función dentro del bucle para verificar si el usuario tiene permiso para ver el contenido personalizado que deseas ocultar:

global $post;
if ( ! post_password_required( $post ) ) {
    // contenido protegido
} else {
    echo get_the_password_form();
}

La protección por contraseña y el formulario de contraseña solo se muestran cuando se llama a the_content() o the_excerpt(), a menos que utilices el enfoque mencionado anteriormente.

1 nov 2011 18:38:38
Comentarios

Esto no parece funcionar, mi página se carga normalmente tanto si estoy conectado como si no.

Rob Rob
2 nov 2011 13:03:35

Tal vez intenta como indicó chip globalizando $post primero - actualizaré mi respuesta.

sanchothefat sanchothefat
2 nov 2011 13:14:34

@rob cuando dices "conectado o no" ¿te refieres a conectado al admin? Cuando pones la contraseña para una página no importa si estás conectado o no, solo recuerda si has introducido la contraseña para ver esa página/entrada. Prueba eliminando todas las cookies del sitio entre pruebas.

sanchothefat sanchothefat
2 nov 2011 13:19:06
8

Hola Rob, todavía no puedo comentar ya que no tengo suficientes privilegios, así que agregaré una respuesta en su lugar para hacer mi pregunta.

¿Esta página es una página normal? Quiero decir, no puedes proteger con contraseña una página si esa página está marcada como página de inicio o página de blog en Ajustes -> Lectura.

12 oct 2011 20:49:03
Comentarios

Ok, lo he cambiado desde la página de inicio pero sigue ocurriendo lo mismo. Cuando navego a la página que tiene contraseña, simplemente se carga normalmente sin pedir ninguna contraseña.

Rob Rob
13 oct 2011 11:48:07

Perdón por preguntarte esto, pero ¿has cerrado sesión cuando intentas acceder a la página, verdad?

chifliiiii chifliiiii
13 oct 2011 15:03:47

Sí, he probado tanto estando logueado como deslogueado, en ambos casos obtengo los mismos resultados.

Rob Rob
13 oct 2011 15:20:37

Lo siento, no puedo ayudar entonces, lo que sí puedo hacer es recomendarte un plugin que yo uso para lograr lo que estás intentando hacer. Lo único es que los usuarios necesitan estar registrados ya que accederán a la página con sus credenciales de inicio de sesión. El plugin se llama Members y puedes encontrarlo en http://wordpress.org/extend/plugins/members/. ¡Espero que te ayude!

chifliiiii chifliiiii
13 oct 2011 15:57:15

@chifliiiiii Creo que mi window.onload = function() { está anulando la protección por contraseña ya que funciona para todas las demás páginas excepto la que quiero. ¿Cómo puedo evitar que el onload omita la funcionalidad de contraseña?

Rob Rob
31 oct 2011 16:12:22

un enlace a la página ayudaría mucho, no estoy seguro sin revisar los scripts

chifliiiii chifliiiii
31 oct 2011 22:12:42

@chifliiiiii Esta es la página en la que estoy trabajando - http://www.mediwales.com/mapping/members/

Rob Rob
1 nov 2011 16:52:10

Veo que está protegida con contraseña Rob

chifliiiii chifliiiii
3 nov 2011 00:57:15
Mostrar los 3 comentarios restantes
0

Una pequeña actualización. El nombre de la plantilla debe ser

<?php
/**
 * Nombre de la plantilla: Protegida por contraseña
 */
?>

Olvidaste incluir "name"

18 oct 2017 10:29:54