Password protecting a page

时间:2011-10-12 作者:Rob

我正在尝试对页面进行密码保护,但它似乎不起作用。我已经为页面设置了密码,但当你导航到它时,它就像正常一样加载,不要求任何密码。

这是我页面上的循环:

<?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(); ?>
我想用密码保护页面中的所有内容。

更新时间:

我在页面上有自定义内容,因此如果可能的话,我需要能够围绕这些内容编写一些代码。

更新时间:enter image description here

4 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

一种解决方案是create a custom Page template 对于要进行密码保护的页面。

首先创建自定义页面模板,可能命名为template-password-protected.php, 并添加Template: 顶部的文件docblock标记,如下所示:

<?php
/**
 * Template: Password-Protected
 */
?>
现在,添加基本页面模板标记:

<?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(); ?>
现在,对其进行修改,以便在页面受密码保护的情况下输出默认内容:

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

基于此评论:

这似乎不起作用,无论我是否登录,我的页面都正常加载。

我怀疑您不是想用密码保护页面,而是想让页面只对登录用户可见?(注意:这两个概念在WordPress中是完全不同的。)

So, running with that assumption, you would want to use is_user_logged_in(), rather than post_password_required().

下面是一个基于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(); ?>
总结如下:

密码保护的帖子/页面

应用每个帖子/页面的密码,用户必须输入该密码才能查看帖子/页面内容。此密码在post edit屏幕中设置,并使用该屏幕上提供的UI将post设置为受密码保护。循环中的帖子/页面内容将根据此每篇帖子设置自动保护。

From the Codex:

Password Protect This Post

要对帖子进行密码保护,请单击右上角发布区域中可见性旁边的编辑,然后单击密码保护,单击确定,然后输入密码。然后点击OK。注意-编辑器和管理员用户可以在编辑视图中查看受密码保护的帖子或私人帖子,而无需知道密码。

受登录保护的帖子/页面

与保护帖子/页面的密码完全分离。需要在中包装内容is_user_logged_in() 有条件的,并且不使用或要求每次发布密码。

EDIT 2

看看你的代码,我不得不问:do you intend to display this map on password-protected pages? 因为这就是您的代码所指示的:

<?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>
此标记表示:if the post password is required, display this javascript map.

我猜这就是opposite 你想要什么?

请尝试以下操作:

<?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(); ?>
另外:我会将您的自定义模板命名为“页面”以外的其他名称

EDIT 3

回复:此评论:

在哪里输入密码以查看内容?

您需要将呼叫添加到get_the_password_form() 内部post_password_required() 输出下面是一个示例:

<?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(); ?>
现在,应该会出现密码表单。

SO网友:sanchothefat

在循环中使用以下函数检查是否允许用户查看要隐藏的自定义内容:

global $post;
if ( ! post_password_required( $post ) ) {
    // protected content
} else {
    echo get_the_password_form();
}
密码保护和密码表单仅在以下情况下显示the_content()the_excerpt() 除非使用上述方法,否则将调用。

SO网友:chifliiiii

嗨,罗布,我还不能发表评论,因为我没有足够的特权,所以我会补充一个答案,而不是问我的问题。

这个页面是普通页面吗?我的意思是,如果页面在设置->阅读中被标记为首页或博客页面,则无法对该页面进行密码保护。

SO网友:Ilana

一个小更新。模板的名称需要为

<?php
/**
 * Template Name: Password-Protected
 */
?>
你漏掉了“名字”

结束

相关推荐

如何在管理中用图标替换“Password Protected”文本

在Wordpress中,每当帖子受到密码保护时,后端管理区域都会在帖子标题后添加粗体“-密码保护”文本。我正在寻找的是一种删除此文本的方法,而是让它使用一个图标(下面的链接),该图标应附加在标题文本之前。如何做到这一点?我想使用Aesthetica Icon Set 通过http://dryicons.com: