wake-up-neo.net

Passwortschutz für Inhalte in benutzerdefinierten Vorlagen

Ich versuche, Inhalte in einer benutzerdefinierten Seitenvorlage mit einem Kennwort zu schützen. Wenn ich jedoch das Kennwort eingebe, das ich im Backend zugewiesen habe, wird die Seite nicht authentifiziert, sondern nur beim Senden neu geladen. Ich weiß, dass der folgende Code nicht großartig ist, aber bitte versuchen Sie, dies zu ignorieren - ich brauche nur Hilfe, damit die Kennwortauthentifizierung richtig funktioniert.

Es wird anscheinend auch nicht überprüft, ob die bestimmte Seite tatsächlich kennwortgeschützt ist, sondern das Kennwortschutzformular angezeigt, unabhängig davon, ob die Seite öffentlich oder kennwortgeschützt ist. Ich vermute, hier liegt das Problem.

<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

Grundlegend wie und warum

Erweitern auf meinem Blogeintrag zu diesem Thema :

Wenn Sie ein Kennwort in ein Formular eingeben, das von get_the_password_form() erstellt wurde, zielt das Formular auf ~/wp-login.php mit einem Abfrageargument namens postpass ab, bei dem es sich um den $actio handelt, den die Anmeldedatei zum Wechseln verwendet. Dort kommt die Klasse PasswordHash zum Einsatz und es wird ein Cookie gesetzt [...]

Wann passiert es?

Die Funktion post_password_required() gibt eine boolesche true zurück, wenn:

  1. ! empty( $post->post_password )
  2. ! isset( $_COOKIE['wp-postpass_' . COOKIEHASH] )
  3. Der Eingabe-Hash des Formulars (/ user) stimmt nicht überein

    require_once ABSPATH . WPINC . '/class-phpass.php';
    $hasher = new PasswordHash( 8, true );
    $hasher->CheckPassword( $post->post_password, $hash );
    
  4. Der gespeicherte Cookie-Wert stimmt nicht überein

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

In all diesen Fällen gibt der Wert true - oder abhängig von Ihrer Vorlage: sollte - das Post-Passwort-Formular mit get_the_password_form() zurück. Protip: Sie können die Benutzeroberfläche über den Filter apply_filters( 'the_password_form', $output ); ändern, und ja, es handelt sich um einfaches HTML als Zeichenfolgenwert.

Minifallen für Kinder

Beachten Sie, dass Anhänge und untergeordnete Seiten (in hierarchischen Beitragstypen) nicht kennwortgeschützt sind. Das muss separat betrachtet werden und der Vorlagencode (überprüfen Sie einfach, ob die Eltern passwortgeschützt sind, wenn Sie Kinder durch Eltern schützen müssen).

API-Überlegungen/Keine Kopfschmerzen

Es gibt tatsächlich einige Kern-API-Funktionen, die etwas für sich selbst ausgeben (Liste möglicherweise nicht vollständig):

  • get_the_content() -> Passwort-Formular mit get_the_password_form() posten
  • the_content() ... das gleiche
  • get_the_excerpt(): __( 'There is no excerpt because this is a protected post.' );
  • the_excerpt() ... das gleiche
  • get_post_class() fügt die Klasse 'post-password-required' zur Ausgabeliste hinzu

Für alle anderen Fälle sollten Sie wahrscheinlich Ihre eigene Logik programmieren.

Mögliche Stopper: Der Benutzer lehnt die Verwendung von Cookies ab

Überprüfen Sie, ob der Benutzer Cookies zulässt. Wenn sie nicht erlaubt sind, haben Sie ein Problem. Das ist eigentlich ganz einfach, da WP standardmäßig mit einem Test-Cookie geliefert wird. Ein Beispiel finden Sie unter wp-login.php. (Die Konstante TEST_COOKIE ist in wp-includes/default-constants.php als define('TEST_COOKIE', 'wordpress_test_cookie'); definiert.)

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

Der zu überprüfende Wert ist also 'WP Cookie check'. Und die Prüfung, die der Kern selbst durchführt, ist:

if ( empty( $_COOKIE[ TEST_COOKIE ] ) )

was Sie leicht in einem Rückruf auf template_redirect replizieren könnten - oder einfach in Ihrer Vorlage. Zeigen Sie dem Benutzer dann an, dass dies ohne Cookies nicht möglich ist.

Wenn dies nicht das Problem ist, müssen Sie tiefer graben und die Frage mit zusätzlichen Informationen aktualisieren.

2
kaiser

Versuchen Sie, die Bedingung umzukehren:

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

Siehe Kodex

Hoffentlich hilft das.

1
Céline Garel