WordPressで404を強制する方法


40

条件に基づいていくつかの投稿に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/…–あなたはそれを読みましたか?
FUXIA

はい、それでもステータスが表示200されます。
RRikesh

回答:


50

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

コードに加えて、この変更されたコード2の例を使用してみてくださいtemplate_include


Code 2あなたは完璧な作品を掲載スニペット。set_header()欠けていたものでした。
RRikesh

@birgireを参照しset_header()て追加しますが、コードでHTTP/1.1 404 Not Found使用しstatus_header()ましたか?
ヘンリーライト14

@henrywrightそれはそこにタイプミスのように見えます、私は答えを更新しました、ありがとう
;

15

このコードは私のために働いた:

add_action( 'wp'、 'force_404');
関数force_404(){
    グローバル$ wp_query; // $ posts(必要な場合)
    if(is_page()){//条件
        status_header(404);
        nocache_headers();
        include(get_query_template( '404'));
        die();
    }
}

ハンディ。カスタムクエリパラメータをチェックしているので、アクションを使用していませんが、プラグインクラスで非常に便利なメソッドになります。
ジョンリード14年

2
ページタイトルを修正するには、次を追加しますglobal $wp_query; $wp_query->is_404 = true;
developerbmw

2

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

1

私の解決策:

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
エラーのリダイレクトは、ページのランキングにとってひどいものです。悪いリクエストと同じ場所にテンプレートを表示するだけです。これを行うと、最初に404を設定し、リダイレクトによって301または302に変更され、200を返すページにリダイレクトされます。その後、検索エンジンによって有効なページとしてインデックスが作成されます。 OPが望んでいないと明示的に述べたものです。
mopsyd

0

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

コードの構文エラーを修正しました。404テンプレートをロードすることもできません。
RRikesh

おそらく、あなたの中で404.phpあなたは別のを読み込むことができますheader.php例えば、<?php get_header('404'); ?>負荷にheader-404.php。そのヘッダーheader('HTTP/1.0 404 Not Found');で、<head>セクションに追加します。
マークディンゲナ

0

マークされたソリューションの使用方法を共有したかった

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。ページを表示できるのは管理者だけです。

他の人の助けになることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.