404.php
模板。我的代码:
function rr_404_my_event() {
global $post;
if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
include( get_query_template( '404' ) );
exit; # so that the normal page isn't loaded after the 404 page
}
}
add_action( 'template_redirect', 'rr_404_my_event', 1 );
相关问题的代码2-相同的问题:
function rr_404_my_event() {
global $post;
if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
global $wp_query;
$wp_query->set_404();
}
}
add_action( 'wp', 'rr_404_my_event' );
我的问题:
虽然看起来不错,但是如果检查“网络”选项卡,我的状态为
200 OK
。由于它的状态为200
,因此恐怕搜索引擎也可能为这些页面编制索引。预期的行为:
我希望发送状态
404 Not Found
。 #1 楼
您可以尝试使用Wordpress函数status_header()
添加HTTP/1.1 404 Not Found
标头; ,因此您的Code 2示例将是:
function rr_404_my_event() {
global $post;
if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
global $wp_query;
$wp_query->set_404();
status_header(404);
}
}
add_action( 'wp', 'rr_404_my_event' );
此函数用于本部分中使用的示例:
wp
中的/wp-includes/class-wp.php
类中的function handle_404() {
...cut...
// Guess it's time to 404.
$wp_query->set_404();
status_header( 404 );
nocache_headers();
...cut...
}
。
template_include
代码。评论
您发布的代码2代码段效果很好。 set_header()丢失了。
– RRikesh
2013年3月25日5:11
@birgire,您引用set_header()添加HTTP / 1.1 404 Not Found但在代码中使用过status_header()吗?
– henrywright
2014年9月8日13:08
@henrywright那里看起来像是错字,我更新了答案,谢谢;-)
– birgire
2014年9月8日下午13:45
#2 楼
这段代码对我有用:add_action( 'wp', 'force_404' ); function force_404() { global $wp_query; //$posts (if required) if(is_page()){ // your condition status_header( 404 ); nocache_headers(); include( get_query_template( '404' ) ); die(); } }
评论
便利。我正在检查自定义查询参数,因此我没有使用该操作,但这在我的插件类中提供了一个非常有用的方法。
–约翰·里德(John Reid)
14-10-17在8:26
添加以下内容以修复页面标题:global $ wp_query; $ wp_query-> is_404 = true;
–developerbmw
16-2-24在22:18
#3 楼
我不建议您强制使用404。如果您担心搜索引擎,为什么不只在这些页面上执行“无索引,无关注”元数据并使用robots.txt阻止它? ?
这可能是阻止查看内容的更好方法。
add_filter( 'template_include', 'nifty_block_content', 99 );
function nifty_block_content( $template ) {
if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
$template = locate_template( array( 'nifty-block-content.php' ) );
}
return $template;
}
您也可以使用此方法加载
404.php
,但是我觉得使用页面模板可能是更好的选择。源
评论
非常感谢您提供的链接,我将改用locate_template()。我认为是robots.txt。这不是防止索引编制的保证方法。一些搜索引擎可能仍会选择该页面。我确实希望页面看起来像普通的404页面。另外,帖子也会动态添加,编辑robots.txt文件会带来更多麻烦。
– RRikesh
13年3月22日在9:23
#4 楼
我的解决方案:add_action( 'wp', 'my_404' );
function my_404()
{
if ( is_404() )
{
header("Status: 404 Not Found");
$GLOBALS['wp_query']->set_404();
status_header(404);
nocache_headers();
//var_dump(getallheaders()); var_dump(headers_list()); die();
}
}
评论
错误重定向对于您的页面排名非常糟糕。只需在与错误请求相同的位置显示模板即可。这样做时会发生的情况是,首先设置404,然后重定向将其更改为301或302,然后重定向到返回200的页面。然后搜索引擎将其索引为有效页面,该页面显然是OP所说的他不想要的。
– mopsyd
18 Mar 15 '18 1:43
#5 楼
状态代码在HTTP请求的标头中发送。您当前的函数已被挂入一个钩子,该钩子将被调用为时已晚。那个时间点甚至可以检查帖子ID,但是可以尝试一下:add_action( 'send_headers', 'rr_404_my_event' );
function rr_404_my_event() {
global $post;
if ( is_singular( 'event' ) && !rr_event_should_be_available( $post->ID ) ) {
include( get_query_template( '404' ) );
header('HTTP/1.0 404 Not Found');
exit;
}
}
评论
我从您的代码中纠正了一些语法错误。我什至没有让我的404模板加载该模板。
– RRikesh
13年3月22日在10:48
也许在404.php中,您可以加载其他header.php,例如<?php get_header('404'); ?>加载header-404.php。在该标头中,您将添加标头(“未找到HTTP / 1.0 404”);在部分中。
– Marc Dingena
13年3月22日在11:07
#6 楼
我想分享使用标记解决方案的方式function fail_safe_for_authors() {
if ((is_user_logged_in()) && (is_author()) && ($_COOKIE["user_role"] !== "administrator")) {
global $wp_query;
$wp_query->set_404();
status_header(404);
}
}
add_action("wp", "fail_safe_for_authors");
我这样做是为了将所有用户类型与管理员分开,在这个项目中,管理员可以查看
author.php
页面。我希望它可以对其他人有所帮助。
评论
来自相关问题:wordpress.stackexchange.com/questions/73738/…–您读过吗?是的,我的状态仍然为200。