web-dev-qa-db-fra.com

Mot de passe protégeant le contenu dans un modèle personnalisé

J'essaie de protéger le contenu par mot de passe dans un modèle de page personnalisé. Toutefois, lorsque je saisis le mot de passe que j'ai attribué au serveur, celui-ci ne s'authentifie pas, mais recharge simplement la page lors de sa soumission. Je sais que le code ci-dessous n'est pas génial, mais essayez de ne pas en tenir compte. J'ai besoin d'aide pour que l'authentification par mot de passe fonctionne correctement.

Apparemment, il ne vérifie pas non plus si la page spécifique est réellement protégée par un mot de passe, mais affiche le formulaire de protection par mot de passe, que la page soit publique ou protégée par un mot de passe;.

<div class="container">
    <?php if (post_password_required()) { ?>
    <div class="trips">
        <div class="homewrap">

        <?php
            // get all the categories from the database
            $args = array('orderby' => 'id', 'order' => 'desc');
            $cats = get_categories($args);
            $i = 0;
            $n = 0;

                // loop through the categries
                foreach ($cats as $cat) {

                    // setup the cateogory ID
                    $cat_id = $cat->term_id;
                    // Make a header for the cateogry
                    $string = $cat->name;
                    $nstring = strtolower(str_replace(" ", "-", $string));
                    echo "<a href='/" .$nstring. "'><div class='where'><h2 class='place'>".$cat->name."</h2></a>";
                    // create a custom wordpress query
                    query_posts("cat=$cat_id&posts_per_page=100");
                    // start the wordpress loop!
                    if (have_posts()) : while (have_posts()) : the_post(); ?>

                        <?php // create our link now that the post is setup 

                            $i++;
                            if ($i >= 2) {
                                echo '<div class="thing">';
                            }

                        ?>

                        <div class="location"><a href="<?php the_permalink();?>"><?php the_title(); ?></a></div>
                        <?php 

                            $thumbnail = get_the_post_thumbnail();
                            $url = get_the_permalink();
                            $description = get_post_meta( get_the_ID(), 'description', true );

                            echo '<div class="pictures">';
                            echo '<div class="featured-thumb"><a href="' .$url. '">' .$thumbnail. '</a></div>';
                                if (class_exists('Dynamic_Featured_Image') ) {
                                    global $dynamic_featured_image;
                                    $featured_images = $dynamic_featured_image->get_featured_images( $postId );
                                    $number = count($featured_images);

                                    for ($i = 0; $i <= 1; $i++) {
                                        echo '<div class="featured-thumb"><a href="' .$url. '"><img src="' .$featured_images[$i]['full']. '"></a></div>';
                                    }
                                }

                            echo '</div><!-- pictures -->'; 
                            echo '<div class="description">' .$description. '</div>';

                            if ($i >= 2) {
                                echo '</div><!-- .thing -->';
                            }

                        ?>

                    <?php endwhile; endif; // done our wordpress loop. Will start again for each category ?>
                <?php } // done the foreach statement ?> 
        </div>   
        </div><!-- .container -->
    </div><!-- .homewrap -->
</div><!-- .trips -->
<?php } else { echo get_the_password_form(); } ?>

<?php

get_footer();
1
Nikki Mather

De base comment et pourquoi

Étendre sur mon article de blog sur ce sujet :

Lorsque vous entrez un mot de passe dans un formulaire créé par get_the_password_form(), le formulaire cible ~/wp-login.php avec un argument de requête nommé postpass, qui est le $action utilisé par le fichier de connexion pour basculer. Là, la classe PasswordHash est utilisée et un cookie est défini [...]

Quand est-ce que cela arrive?

La fonction post_password_required() renvoie une valeur booléenne true si:

  1. ! empty( $post->post_password )
  2. ! isset( $_COOKIE['wp-postpass_' . COOKIEHASH] )
  3. Le hachage de saisie du formulaire (/ utilisateur) ne correspond pas

    require_once ABSPATH . WPINC . '/class-phpass.php';
    $hasher = new PasswordHash( 8, true );
    $hasher->CheckPassword( $post->post_password, $hash );
    
  4. La valeur du cookie enregistré ne correspond pas

    $hash = wp_unslash( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] );
    0 !== strpos( $hash, '$P$B' )
    

Dans tous les cas, la valeur true - ou selon votre modèle: devrait - renvoyer le formulaire de mot de passe suivant à l'aide de get_the_password_form(). Protip: Vous pouvez modifier son interface utilisateur via le filtre apply_filters( 'the_password_form', $output ); et, oui, c'est du HTML pur en tant que valeur de chaîne.

Minetraps pour les enfants

N'oubliez pas que les pièces jointes et les pages enfants (dans les types d'articles hiérarchiques) ne seront pas protégées par mot de passe. Cedoit être pris en compte séparémentet le code du modèle (vérifiez simplement si le parent est protégé par un mot de passe si vous devez protéger les enfants de ses parents).

Considérations sur l'API/Pas de réflexion

Il existe en fait des fonctions de base de l'API qui généreront quelque chose par eux-mêmes (la liste peut ne pas être complète):

  • get_the_content() -> Formulaire de publication de mot de passe avec get_the_password_form()
  • the_content() ... le même
  • get_the_excerpt(): __( 'There is no excerpt because this is a protected post.' );
  • the_excerpt() ... le même
  • get_post_class() va ajouter la classe 'post-password-required' à la liste de sortie

Pourtous les autres casvous devriez probablement coder votre propre logique.

Bouchons possibles: l'utilisateur refuse l'utilisation des cookies

Vérifiez si l'utilisateur autorise les cookies. S'ils ne sont pas autorisés, vous avez un problème. C'est en fait assez facile car WP est livré avec un cookie test par défaut. Voir wp-login.php pour un exemple. (La constante TEST_COOKIE est définie dans wp-includes/default-constants.php en tant que define('TEST_COOKIE', 'wordpress_test_cookie');):

if ( SITECOOKIEPATH != COOKIEPATH )
        setcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure );

Donc, la valeur à vérifier est 'WP Cookie check'. Et le contrôle que fait ce noyau est le suivant:

if ( empty( $_COOKIE[ TEST_COOKIE ] ) )

que vous pouvez facilement répliquer dans un rappel sur template_redirect - ou simplement dans votre modèle. Présentez ensuite à l'utilisateur un message lui indiquant qu'il ne fonctionnera pas sans cookies.

Si ce n'est pas le problème, vous devrez alors creuser plus profondément et mettre à jour la question avec des informations supplémentaires.

2
kaiser

Essayez d'inverser la condition:

if(post_password_required( )):
    echo get_the_password_form();
else:
    // if password not required or password cookie is present
    // your protected content here
endif;

Voir codex

J'espère que cela pourra aider.

1
Céline Garel