我需要根据条件在某些帖子上强制使用404。我设法做到了(尽管我不知道我做对的方法是否正确),而且我正在按预期方式加载我的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

评论

来自相关问题:wordpress.stackexchange.com/questions/73738/…–您读过吗?

是的,我的状态仍然为200。

#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页面。

我希望它可以对其他人有所帮助。