web-dev-qa-db-ja.com

カスタムテンプレートのコンテンツをパスワードで保護する

カスタムページテンプレートのコンテンツをパスワードで保護しようとしていますが、バックエンドで割り当てたパスワードを入力しても認証されず、送信時にページがリロードされるだけです。以下のコードは素晴らしいものではないことを私は知っていますが、これを無視してみてください - パスワード認証を正しく機能させるための手助けが必要です。

また、特定のページが実際にパスワードで保護されているかどうかを確認しないように見えますが、その代わりに、ページがパブリックかパスワードで保護されているかに関係なく、パスワード保護フォームを表示します。

<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

条件を逆にしてみてください。

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

codex を参照してください。

それが役立つことを願っています。

2
Céline Garel

基本的な方法と理由

そのトピックについての私のブログ投稿の を拡張する

get_the_password_form()によって作成されたフォームにパスワードを入力すると、そのフォームはpostpassという名前のクエリ引数を持つ~/wp-login.phpをターゲットにします。これはログインファイルが切り替えるために使用する$actionです。そこでPasswordHashクラスが使われ、クッキーが設定されます[...]

それはいつ起こりますか?

以下の場合、post_password_required()関数はブール値のtrueを返します。

  1. ! empty( $post->post_password )
  2. ! isset( $_COOKIE['wp-postpass_' . COOKIEHASH] )
  3. フォーム(/ユーザー)入力ハッシュが一致しません

    require_once ABSPATH . WPINC . '/class-phpass.php';
    $hasher = new PasswordHash( 8, true );
    $hasher->CheckPassword( $post->post_password, $hash );
    
  4. 保存されたCookieの値が一致しません

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

すべての場合において、trueの値は - あるいはあなたのテンプレートによりますが - get_the_password_form()を使ってポストパスワードフォームを返します。 Protip:apply_filters( 'the_password_form', $output );フィルタを使ってUIを変更できます。そうです、文字列値としてのプレーンHTMLです。

子供用のミニトラップ

添付ファイルと子ページ(階層型投稿タイプ)はパスワードで保護されないことに注意してください。は別の考慮事項とテンプレートコードを必要とします(親が子供を保護する必要がある場合は、単に親がパスワードで保護されているかどうかを確認してください)。

APIに関する考慮事項

実際に something を出力するコアAPI関数がいくつかあります(リストは完全ではないかもしれません)。

  • get_the_content() - > get_the_password_form()でパスワードの投稿フォーム
  • the_content() ...同じ
  • get_the_excerpt()__( 'There is no excerpt because this is a protected post.' );
  • the_excerpt() ...同じ
  • get_post_class()'post-password-required'クラスを出力リストに追加します

その他すべての場合あなたはおそらくあなた自身のロジックをコーディングするべきです。

考えられる栓:ユーザーがCookieの使用を拒否

ユーザーがCookieを許可しているか確認してください。許可されていない場合は、問題があります。 WPにはデフォルトでテスト用のCookieが付属しているので、これは実際には非常に簡単です。例としてwp-login.phpを参照してください。 (TEST_COOKIE定数はwp-includes/default-constants.phpdefine('TEST_COOKIE', 'wordpress_test_cookie');として定義されています):

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

そのため、チェックする値は'WP Cookie check'です。そして、コア自身がチェックすることは、

if ( empty( $_COOKIE[ TEST_COOKIE ] ) )

これはtemplate_redirectのコールバックで、あるいは単にあなたのテンプレートの中で簡単に複製できます。その後、Cookieがないと機能しないというメッセージをユーザーに提示します。

これが問題ではない場合、あなたはより深く掘り下げる必要があり、追加情報で質問を更新します。

2
kaiser