密码保护自定义模板中的内容

时间:2014-12-15 作者:Nikki Mather

我试图用密码保护自定义页面模板中的内容,但是当我输入在后端分配的密码时,它不会进行身份验证,而只是在提交时重新加载页面。我知道下面的代码不太好,但请不要理会这一点-我只需要帮助密码验证正常工作。

它似乎也不会检查特定页面是否确实受密码保护,而是显示密码保护表单,无论该页面是公开的还是受密码保护的,所以我猜问题就在这里。

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

2 个回复
SO网友:Céline Garel

尝试反转条件:

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

希望这有帮助。

SO网友:kaiser

扩展的基本方式和原因on my blog post about that topic:

在生成的表单中输入密码时get_the_password_form(), 表单目标~/wp-login.php 使用名为postpass的查询参数$action登录文件用于切换。在那里PasswordHash 类开始使用并设置cookie[…]

什么时候发生的

Thepost_password_required() 函数返回布尔值true 如果:

  1. ! empty( $post->post_password )
  2. ! isset( $_COOKIE[\'wp-postpass_\' . COOKIEHASH] )

    require_once ABSPATH . WPINC . \'/class-phpass.php\';
    $hasher = new PasswordHash( 8, true );
    $hasher->CheckPassword( $post->post_password, $hash );
    
    保存的Cookie值不匹配

    $hash = wp_unslash( $_COOKIE[ \'wp-postpass_\' . COOKIEHASH ] );
    0 !== strpos( $hash, \'$P$B\' )
    
    在所有这些情况下true 值will-或取决于您的模板:should-使用返回post密码表单get_the_password_form(). Protip:您可以通过apply_filters( \'the_password_form\', $output ); 过滤,是的,它是纯HTML作为字符串值。

    儿童陷阱

    请记住,附件和子页面(在分级帖子类型中)将不受密码保护。那个needs separate consideration 和模板代码(如果需要家长保护孩子,只需检查家长是否受密码保护)。

    API注意事项/不假思索的人实际上有一些核心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\' 类的输出列表all other cases 您可能应该编写自己的逻辑。

      可能的阻止因素:用户拒绝使用Cookie检查用户是否允许使用Cookie。如果他们不被允许,你就有问题了。这实际上很容易,因为WP每个默认值都有一个测试cookie。看见wp-login.php 例如。(TheTEST_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\'. core本身所做的检查是:

      if ( empty( $_COOKIE[ TEST_COOKIE ] ) )
      
      您可以在上的回调中轻松复制template_redirect - 或者只是在模板中。然后向用户显示一条消息,说明没有cookie它无法工作。

      如果这不是问题所在,那么你必须深入挖掘,并用其他信息更新问题。

结束

相关推荐

Execute php in pages

我需要在wordpress中执行我的个人php代码来打印mysql数据库中的数据。我只能在页面上执行。我的想法是创建一个文件页pagename。php,复制页面主体。php模板并更改此代码:<?php while ( have_posts() ): the_post(); ?> <article <?php post_class(\'group\'); ?>> <?php get_temp