web-dev-qa-db-ja.com

WordPressに404を強制する方法

私は条件に基づいていくつかの投稿に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を送信したいです。

37
RRikesh

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.phpwpクラスから。

それであなたのtemplate_includeコードに加えてこの修正された コード2 例を使ってみてください。

47
birgire

このコードは私にとって役に立ちました:

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

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をロードすることもできますが、私はページテンプレートを使うのがより良い選択肢かもしれないと思います。

ソース

2
Brooke.

私の解決策:

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();
    }
}
1
T.Todua

ステータスコードは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; 
    }
}
0
Marc Dingena