如何在WordPress上强制使用404

时间:2013-03-22 作者:RRikesh

我需要根据条件在一些帖子上强制使用404。我成功地做到了(虽然我不知道我是否做得对),而且我的404.php 要按预期加载的模板。

My code:

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来自this related question - 同样的问题:

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\' );

My Issue:

虽然看起来不错,但我得到了一个200 OK 如果我选中网络选项卡。因为这是一种状态200, 我担心搜索引擎也会索引这些页面。

Expected Behaviour:

我想要一个状态404 Not Found 待发送。

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

你可以试试Wordpress功能status_header() 添加HTTP/1.1 404 Not Found 收割台;

因此,您的代码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\' );
例如,本部分使用此功能:

function handle_404() {
    ...cut...
    // Guess it\'s time to 404.
    $wp_query->set_404();
    status_header( 404 );
    nocache_headers();
    ...cut...
}
wp 中的类/wp-includes/class-wp.php.

因此,除了您的template_include 密码

SO网友:golchha21

此代码对我有效:

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();
    }
}

SO网友:Brooke.

我不建议强制使用404。

如果你担心搜索引擎,为什么不在那些页面上做一个“无索引,无后续”的元,并用机器人阻止它。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 但我觉得使用页面模板可能是一个更好的选择。

source

SO网友:T.Todua

My solution:

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();
    }
}
SO网友:Marc Dingena

状态代码在HTTP请求的标头中发送。您当前的函数被挂接到一个钩子中,该钩子将被调用得太晚。

你应该尝试钩住你的功能rr_404_my_event() 采取行动send_headers.

我不确定当时是否有可能检查帖子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; 
    }
}

SO网友:Gendrith

我想分享我使用标记解决方案的方式

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");
我这样做是为了分开all user typesadministrator, 在这个项目中,只有管理员可以看到author.php

我希望它能帮助别人。

SO网友:JacobTheDev

我发现实现这一目标最可靠的方法是template_include 过滤器,如下所示:

function wpse91900_force_404(string $template): string {
    if ($some_condition) {
        global $wp_query;

        $wp_query->set_404();
        status_header(404);
        nocache_headers();

        $template = get_404_template();
    }

    return $template;
}
add_filter("template_include", "wpse91900_force_404");

结束