如何检查帖子是否为私人帖子?

时间:2013-01-05 作者:hornj

我想做的是检查一个页面是否是私有的,给用户注册和查看页面的选项。以下是我现在拥有的:

<?php
if (have_posts()) :
    /* Print the most as normal */
else : 
  if ($post->post_status = \'private\')
    { 
    /* Print login/register box */
    }
  else
    { 
    /* Print page not found message */
    }
endif; ?>
我的问题是,即使页面不存在,它也总是会出现并显示登录框。如何修复此问题?

2 个回复
最合适的回答,由SO网友:Adam 整理而成

当帖子设置为private时,未登录的用户将收到404消息。如果转储全局变量$wp_query,

var_dump($wp_query);
。。你会注意到没有post_status 因此使用slug返回的参数中存在(或name 的参数query_vars 数组)我们可以获取尝试访问的帖子的帖子状态,如下所示,

global $wp_query;
$slug = $wp_query->query_vars[\'name\'];
$status = get_page_by_path($slug, OBJECT, \'post\');

if ($status->post_status == "private") {

     //show form

} else {

    //etc...

}
有用的法典资源:

http://codex.wordpress.org/Function_Reference/get_page_by_path

更新:

基于您正在尝试为;第“”页;帖子类型(根据您的评论)上述代码应更改\'post\'\'page\' 相应地get_page_by_path().

现在,它在使用时仍然不起作用的原因是$wp_query->query_vars[\'name\']; 然后与您的页面是另一个页面的子页面这一事实相关,换句话说,它有一个父页面。

因为我们使用的函数是通过其路径获取页面,所以它需要知道其完整路径,以便父页面起作用。因此,我们必须改变,

$slug = $wp_query->query_vars[\'name\'];

$slug = $wp_query->query[\'pagename\']; //which will show the full path e.g. parent/child
进一步阐述我们正在做的是从$wp_query 下面是一个示例(示例片段)$wp_query 在转储结果时实际包含

  ["query"]=>  //we are now accessing the ["query"] array instead of ["query_vars"]
  array(2) {
    ["page"]=>
    string(0) ""
    ["pagename"]=> //and this is what need, notice the full path
    string(20) "sample-page/sub-page"
  }
  ["query_vars"]=>
  array(57) {
    ["page"]=>
    int(0)
    ["pagename"]=> //this is what we don\'t need, no full path contained, will not work
    string(8) "sub-page"
    etc.......
因此,完整修改后的代码如下所示;

global $wp_query;
$slug = $wp_query->query[\'pagename\']; //from ->query_vars to ->query
$status = get_page_by_path($slug, OBJECT, \'page\'); //change to meet your desired post_type

if ($status->post_status == "private") {

     //show form

} else {

    //etc...

}
正如Kaiser提到的,您也可以使用,get_post_status() 函数检索post状态,可以这样做,

if (get_post_status($status->ID) == "private") ... etc

SO网友:Pocketninja

2020年我自己也在四处寻找这个答案,现在看来这是一个很好的方法。

<?php if ( $wp_query->have_posts() ) : ?>
  <?php while ( $wp_query->have_posts() ) : ?>
    <?php $wp_query->the_post(); ?>

    <?php if ( get_post_status ( get_the_ID() ) == \'private\' ) { ?>
      <h1>Private</h1>
    <?php } ?>
  <?php endwhile; ?>
<?php endif; ?>

结束

相关推荐

我可以用什么替换‘.get_bloginfo(’url‘)。’用来返回当前URL而不是家庭地址?

我正在使用Any Mobile Theme Switcher 可在完整主题和移动主题之间自动切换的插件。唯一的问题是,“切换到移动站点”和“切换到完整站点”链接会将您带到主页,而不是当前页面。相关的代码位似乎是这样的:function show_theme_switch_link_func( $atts ){ $desktopSwitchLink = get_option(\'show_switch_link_for_desktop\'); glo