私は条件に基づいていくつかの投稿に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' );
私の問題:
それはlook goodですが、ネットワークタブをチェックすると200 OK
というステータスになります。ステータスは200
なので、検索エンジンがそれらのページにもインデックスを付けるのは怖いです。
予想される動作:
ステータス404 Not Found
を送信したいです。
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-includes/class-wp.php
のwp
クラスから。
それであなたのtemplate_include
コードに加えてこの修正された コード2 例を使ってみてください。
このコードは私にとって役に立ちました:
add_action( 'wp'、 'force_404'); function force_404(){ global $ wp_query; // $ posts(必要なら) if(is_page()){//あなたの状態 status_header(404); nocache_headers(); include( get_query_template( '404')); die(); } }
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
をロードすることもできますが、私はページテンプレートを使うのがより良い選択肢かもしれないと思います。
私の解決策:
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();
}
}
ステータスコードはHTTPリクエストのヘッダで送信されます。あなたの現在の関数は遅すぎると呼ばれるフックにフックされています。
あなたは自分の関数rr_404_my_event()
をアクションsend_headers
にフックしようとするべきです。
その時点でPost 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;
}
}