如何以编程方式生成404?

时间:2012-11-23 作者:dave1010

我怎样才能让这样的东西发挥作用?

// in a plugin / theme:
// This imaginary function will make WordPress think that the 
// current request is a 404. 
// Ideally this function could be ran anywhere, but realistically it
// will probably have to be before the template_redirect hook runs.
generate_404_somehow();

// later...
add_action(\'template_redirect\', function() {
    // should be "true"
    var_dump(is_404());
});
基本上,在某些条件下,我想告诉WordPress显示其404模板(如果需要,我可以稍后连接到该模板),而不是它将要加载的模板(例如页面或存档)。

我知道我可以302 重定向到一个不存在的页面,但这很混乱。我也可以发送404 HTTP头是手动的,但是我不能使用WP的漂亮的404页面(我已经有一些东西可以挂接到is_404() 需要在适当的时候被解雇)。

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

function generate_404_somehow() {
   global $wp_query;
   $wp_query->is_404 = true;
}
add_action(\'wp\',\'generate_404_somehow\');
当然,这会将所有页面发送到404模板。我不知道在什么条件下应该开火还是不开火。

或者更加谨慎(见评论)。。。

function generate_404_somehow() {
   global $wp_query;
   $wp_query->set_404();
}
add_action(\'wp\',\'generate_404_somehow\');

SO网友:Erik J.

s\\u ha\\u dum answers的另一个未将HTTP标头状态设置为404 Not Found。为此,添加status_header( 404 ) 到函数。

function generate_404_somehow() {
    global $wp_query;
    $wp_query->set_404();
    status_header( 404 );
}
add_action(\'wp\',\'generate_404_somehow\');

SO网友:dave1010

似乎有效的方法:

global $wp_query;
$wp_query->set_404();
$wp_query->max_num_pages = 0; // stop theme from showing Next/Prev links
这似乎可以设置HTTP头并加载正确的模板(使用is_404() 是真的)。

结束