当帖子设置为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