What? 我正在修改我的主题,以便在单独的页面上显示帖子的评论。
How? 主要地based on this answer 但是通过改进的检查和代码。这就是我的页面评论。php(有点像):
(The code is very easy to scan through, trust me!)
<?php get_header(); ?>
<?php
/*
* (Example URL: example.com/comments/?original_post=ID)
*
* Check if HTTP variable (original_post) exists in queried URL,
* AND that it is set to some value (ID), AND that the value (ID) is a number.
*/
if( array_key_exists( \'original_post\', $_GET ) && isset( $_GET[\'original_post\'] ) && ctype_digit( $_GET[\'original_post\'] ) ) {
$query_original_post = new WP_Query( array(
\'posts_per_page\' => 1,
\'p\' => $_GET[\'original_post\'],
\'post_type\' => \'any\',
) );
if( $query_original_post->have_posts() ) {
while ( $query_original_post->have_posts() ) : $query_original_post->the_post();
// [...]
endwhile;
wp_reset_postdata();
} else {
/*
* Return 404 error if there are no posts
*/
global $wp_query;
$wp_query->set_404();
status_header( 404 );
nocache_headers();
get_template_part( \'404\', \'archive\' );
//exit();
}
} else {
/*
* Return 404 error if the HTTP variable (original_post) doesn\'t
* exist in queried URL, OR it isn\'t set to any value (ID),
* OR the value (ID) isn\'t a number.
*/
global $wp_query;
$wp_query->set_404();
status_header( 404 );
nocache_headers();
get_template_part( \'404\', \'archive\' );
//exit();
}
?>
<?php get_footer(); ?>
(我用来返回404错误的代码基于
these two solutions.)
正如你所看到的,我在代码中做了两次检查(at least that\'s what I intended to do):
检查查询的URL中是否存在HTTP变量(original\\u post),并将其设置为某个值(ID),并且该值(ID)是一个数字。否则,返回一个404错误和适当的标题。
检查自定义WordPress查询($query_original_post
) 有任何要循环的结果。否则,返回一个404错误和适当的标题。
Problem:
<这样做对吗?(或者至少,它能更简单些吗?)
(如果对#1是)它似乎可以工作,但当我转到如下URL时,返回200 OK标头:example.com/comments/?original_post=NUMBER
, 其中数字是长度超过4位的任何正整数(例如14532)。我不理解这种关系。为什么要这样做呢。com/注释/?original\\u post=14532 `当我登录WordPress时返回200 OK标题,当我没有登录WordPress时返回404 error(应该是哪个错误)?
最合适的回答,由SO网友:s_ha_dum 整理而成
在您尝试更改标题之前很久就会发送标题。标头由与关联的操作发送get_header()
, 因此,当代码执行时,更改标头为时已晚。你可以通过一个简单的实验来证明这一点。请尝试以下各项:
get_header();
status_header( 404 );
以及
status_header( 404 );
get_header();
在模板文件中,并使用以下工具查看输出
HttpFox 或
Wireshark (如果你真的想找点乐子:))。
要有效地更改标题,您需要在之前运行逻辑get_header()
.
我相信这将获得您想要的效果,只需引导更少的代码行:
/*
* (Example URL: example.com/comments/?original_post=ID)
*
* Check if HTTP variable (original_post) exists in queried URL,
* AND that it is set to some value (ID), AND that the value (ID) is a number.
*/
if(
array_key_exists( \'original_post\', $_GET )
&& isset( $_GET[\'original_post\'] )
&& ctype_digit( $_GET[\'original_post\'] )
) {
$query_original_post = new WP_Query(
array(
\'posts_per_page\' => 1,
\'p\' => $_GET[\'original_post\'],
\'post_type\' => \'any\',
)
);
if( !$query_original_post->have_posts() ) {
global $wp_query;
$wp_query->set_404();
status_header( 404 );
nocache_headers();
}
}
get_header();
if( !empty($query_original_post) && $query_original_post->have_posts() ) {
while ( $query_original_post->have_posts() ) {
$query_original_post->the_post();
// [...]
}
wp_reset_postdata();
} else {
get_template_part( \'404\', \'archive\' );
}
get_footer();
出于对所有神圣事物的热爱,请不要使用PHP开头和结尾标记,除非您确实需要它们。