web-dev-qa-db-fra.com

Mot de passe protégeant une page

J'essaie de protéger une page par mot de passe, mais elle ne semble pas fonctionner. J'ai défini le mot de passe pour la page, mais lorsque vous y accédez, il se charge comme d'habitude et ne demande aucun mot de passe.

C'est la boucle que j'ai sur ma page:

<?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(); ?>

Je veux protéger par mot de passe tout ce qui se trouve dans la page.

METTRE À JOUR:

J'ai un contenu personnalisé sur la page, donc, si possible, je dois pouvoir envelopper du code autour de tout.

Mettre à jour: enter image description here

4
Rob

Une solution serait de créer un modèle de page personnalisé pour les pages que vous souhaitez protéger par mot de passe.

Commencez par créer votre modèle de page personnalisé, peut-être nommé template-password-protected.php, et ajoutez la balise Template: file-docblock en haut, comme suit:

<?php
/**
 * Template: Password-Protected
 */
?>

Maintenant, ajoutez votre balise de base de modèle de page:

<?php
/**
 * Template: Password-Protected
 */
?>

<?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(); ?>

Maintenant, modifiez-le pour que le contenu par défaut soit affiché si la page est protégée par un mot de passe:

<?php
/**
 * Template: Password-Protected
 */
?>

<?php get_header(); ?>

<div id="main">

<?php
// Globalize $post
global $post;
// Test for password-protected page
// Returns true if post is password-protected
// and if the password doesn't match cookie
if ( post_password_required( $post ) ) {
    ?>
    <p>
    CUSTOM CONTENT THAT DISPLAYS ONLY WHEN PAGE IS PASSWORD PROTECTED
    GOES HERE
    </p>
    <?php
} else { 
    // Page isn't password-protected
    ?>

<?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(); ?>

EDIT

Basé sur ce commentaire:

Cela ne semble pas fonctionner, ma page se charge normalement, que je sois connecté ou non.

Je soupçonne qu'au lieu de protection par mot de passe _ Pages, vous souhaitiez réellement que les Pages ne soient visibles que par utilisateurs connectés? (Remarque: ces deux concepts sont des choses totalement distinctes dans WordPress.)

Donc, avec cette hypothèse, vous voudriez utiliser is_user_logged_in() , plutôt que post_password_required() .

Voici un exemple de modèle de page personnalisé basé sur is_user_logged_in():

<?php
/**
 * Template: Login-Required
 */
?>

<?php get_header(); ?>

<div id="main">

<?php
// Globalize $post
global $post;
// Test for password-protected page
// Returns true if post is password-protected
// and if the password doesn't match cookie
if ( ! is_user_logged_in() ) {
    ?>
    <p>
    CUSTOM CONTENT THAT DISPLAYS ONLY WHEN USER IS NOT LOGGED IN
    GOES HERE
    </p>
    <?php
} else { 
    // Page isn't password-protected
    ?>

<?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(); ?>

Résumer:

  1. Mot de passe protégé Post/Page

    Appliquez un mot de passe par publication/page que les utilisateurs doivent saisir pour afficher le contenu de la publication/de la page. Ce mot de passe est défini dans l'écran de post-édition et utilise l'interface utilisateur fournie sur cet écran pour définir la publication comme protégée par mot de passe. Le contenu de la publication/de la page à l'intérieur de la boucle est automatiquement protégé en fonction de ce paramètre défini pour chaque publication.

    Du Codex :

    Protégez votre message par un mot de passe

    Pour protéger un message par un mot de passe, cliquez sur Modifier en regard de Visibilité dans la zone de publication en haut à droite, puis cliquez sur Protégé par mot de passe, sur OK et entrez un mot de passe. Puis cliquez sur OK. Remarque - Les utilisateurs rédacteurs et administrateurs peuvent voir les publications protégées par un mot de passe ou privées dans la vue de modification sans connaître le mot de passe.

  2. Login Post protégé/Page

    Complètement séparé de protection par mot de passe une publication/page. Requiert le wrapping du contenu dans une condition is_user_logged_in(), et n'utilise ni ne requiert de mot de passe par publication.

EDIT 2

En regardant votre code, je dois demander: avez-vous l'intention d'afficher cette carte sur des pages protégées par mot de passe? Parce que c'est ce que votre code indique:

<?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>

Ce balisage dit: si le mot de passe de publication est requis, affichez cette carte javascript .

Je suppose que c'est le opposé de ce que vous voulez?

Essayez ceci à la place:

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

get_header(); ?>

<?php
global $post;
if ( post_password_required( $post ) ) {
?>
<p>THIS POST IS PASSWORD PROTECTED. PLEASE ENTER THE PASSWORD TO VIEW THIS POST.</p>

<?php 
} else { 
// No password required, or password has been entered
?>


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

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

window.onload = function() { 

...

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



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

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

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

Aussi: je nommerais votre modèle personnalisé autrement que "Page"

EDIT 3

Re: ce commentaire:

où pourrais-je entrer un mot de passe pour voir le contenu?

Vous devrez ajouter un appel à get_the_password_form() dans la sortie post_password_required(). Voici un exemple:

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

get_header(); ?>

<?php
global $post;
if ( post_password_required( $post ) ) {
?>
<p>THIS POST IS PASSWORD PROTECTED. PLEASE ENTER THE PASSWORD TO VIEW THIS POST.</p>

<?php echo get_the_password_form(); ?>

<?php 
} else { 
// No password required, or password has been entered
?>


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

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

window.onload = function() { 

...

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



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

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

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

Maintenant, le formulaire de mot de passe devrait apparaître.

10
Chip Bennett

Utilisez la fonction suivante dans la boucle pour vérifier si l'utilisateur est autorisé à voir le contenu personnalisé que vous souhaitez masquer:

global $post;
if ( ! post_password_required( $post ) ) {
    // protected content
} else {
    echo get_the_password_form();
}

La protection par mot de passe et le formulaire de mot de passe ne s'affichent que lorsque the_content() ou the_excerpt() sont appelés, sauf si vous utilisez l'approche ci-dessus.

3
sanchothefat

Salut Rob je ne peux pas encore commenter car je n'ai pas assez de privilèges donc je vais ajouter une réponse à la place de poser ma question.

Cette page est une page normale? Je veux dire, vous ne pouvez pas protéger par mot de passe une page si cette page est marquée comme page de couverture ou page de blog dans Paramètres -> Lecture.

1
chifliiiii

Une petite mise à jour. Le nom du modèle doit être

<?php
/**
 * Template Name: Password-Protected
 */
?>

Vous avez omis "nom"

0
Ilana