WordPressで404を強制する方法
-
-
_関連する質問から:_ http://wordpress.stackexchange.com/questions/73738/how-do-i-programmatically-generate-a-404 –それを読みましたか?From the _related questions:_ http://wordpress.stackexchange.com/questions/73738/how-do-i-programmatically-generate-a-404 – did you read that?
- 0
- 2013-03-22
- fuxia
-
はい、それでもステータスは「200」になります.Yes, I still get a status `200` with that.
- 0
- 2013-03-22
- RRikesh
-
6 回答
- 投票
-
- 2013-03-24
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
コードに加えて、この変更された Code 2 の例を使用してみてください.You could try the Wordpress function
status_header()
to add theHTTP/1.1 404 Not Found
header;So your Code 2 example would be:
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' );
This function is for example used in this part:
function handle_404() { ...cut... // Guess it's time to 404. $wp_query->set_404(); status_header( 404 ); nocache_headers(); ...cut... }
from the
wp
class in/wp-includes/class-wp.php
.So try using this modified Code 2 example in addition to your
template_include
code.-
投稿した `Code2`スニペットは完全に機能します.`set_header()`が欠けていたものでした.The `Code 2` snippet you posted works perfectly. The `set_header()` was what was missing.
- 0
- 2013-03-25
- RRikesh
-
@birgireは `set_header()`を参照して `HTTP/1.1 404 Not Found`を追加しましたが、コードで` status_header() `を使用しましたか?@birgire you refer to `set_header()` to add `HTTP/1.1 404 Not Found` but have used `status_header()` in your code?
- 0
- 2014-09-08
- henrywright
-
@henrywrightそこにタイプミスのようです、私は答えを更新しました、ありがとう;-)@henrywright it looks like a typo there, I updated the answer, thanks ;-)
- 0
- 2014-09-08
- birgire
-
- 2013-03-24
このコードは私のために働いた:
add_action( 'wp'、 'force_404'); 関数force_404(){ グローバル$ wp_query;//$posts(必要な場合) if(is_page()){//あなたの状態 status_header(404); nocache_headers(); include(get_query_template( '404')); die(); } }
This code worked for me:
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(); } }
-
ハンディ.カスタムクエリパラメータをチェックしているので、アクションは使用していませんが、プラグインクラスで非常に便利なメソッドになります.Handy. I'm checking for custom query parameters so I'm not using the action, but it makes for a very useful method in my plugin class.
- 0
- 2014-10-17
- John Reid
-
以下を追加して、ページタイトルを修正します. `グローバル$ wp_query;` `$ wp_query->is_404=true;`Add the following to fix the page title: `global $wp_query;` `$wp_query->is_404 = true;`
- 2
- 2016-02-24
- developerbmw
-
- 2013-03-22
404を強制することはお勧めしません.
検索エンジンが心配な場合は、それらのページで「no-index、no-follow」メタを実行し、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
を読み込むこともできますが、ページテンプレートを使用する方がよいと思います.ソース I wouldn't recommend forcing a 404.
If you're worried about search engines why not just do a "no-index,no-follow" meta on those pages and block it with robots.txt?
This may be a better way to block the content from being viewed
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; }
You could probably also use this method to load
404.php
but I feel that using a page template might be a better option.-
リンクをありがとうございました.代わりに `locate_template()`の使用に切り替えます.`robots.txt.`は、インデックス作成から保護するための保証された方法ではないと思います.一部の検索エンジンはまだページを取得する可能性があります.ページを通常の404ページのように見せたいのですが.また、投稿は動的に追加されるため、 `robots.txt`ファイルを編集するとさらに問題が発生します.Thanks a lot for the link, I'll switch to using `locate_template()` instead. I think that `robots.txt.` isn't a guaranteed way to protect from indexation. Some search engines might still pick up the page. I do want the page to look like a normal 404 page. Also the posts are going to be dynamically added, editing the `robots.txt` file will add more trouble.
- 0
- 2013-03-22
- RRikesh
-
- 2014-07-21
私の解決策:
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(); } }
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(); } }
-
エラーでリダイレクトすることはあなたのページランキングにとってひどいです.悪いリクエストと同じ場所にテンプレートを表示するだけです.これを行うと、最初に404を設定し、リダイレクトによって301または302に変更され、200を返すページにリダイレクトされます.その後、検索エンジンによって有効なページとしてインデックスが作成されます.OPが望んでいないと言ったことは明らかです.Redirecting on errors is terrible for your page ranking. Just show a template at the same location as the bad request. What will happen when you do that is you initially set a 404, and then the redirect alters it to a 301 or 302, which then redirects to a page that returns a 200. That then gets indexed by search engines as a valid page, which is explicitly what OP said he didn't want.
- 1
- 2018-03-15
- mopsyd
-
- 2013-03-22
ステータスコードは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; } }
Status codes are sent in the headers of HTTP requests. Your current function is hooked into a hook that will be called too late.
You should try to hook your function
rr_404_my_event()
into actionsend_headers
.I'm not sure if at that point in time it's even possible to check the Post ID, but give this a go:
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テンプレートをロードすることすらできません.I corrected some syntax errors from your codes. I don't even get my 404 template to load with that.
- 0
- 2013-03-22
- RRikesh
-
おそらく、 `404.php`で、別の` header.php`をロードできます.` `は` header-404.php`をロードします.そのヘッダーの ``セクションに `header( 'HTTP/1.0 404 Not Found');`を追加します.Perhaps, in your `404.php` you could load a different `header.php`, e.g. `` to load `header-404.php`. In that header, you'd add `header('HTTP/1.0 404 Not Found');` in the `` section.
- 0
- 2013-03-22
- Marc Dingena
-
- 2019-10-04
マークされたソリューションの使用方法を共有したかった
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
ページを表示できます..他の人の役に立つことを願っています.
I wanted to share the way I used the marked solution
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");
I did this to separate all user types from the administrator, in this project, Only the admin can see the
author.php
page.I hope it could help somebody else.
条件に基づいて、一部の投稿に404を強制する必要があります.なんとかできました(正しい方法で行ったかどうかはわかりませんが).
404.php
テンプレートを期待どおりに読み込むことができます.私のコード:
私の問題:
見た目は ですが、[ネットワーク]タブを確認すると
200 OK
のステータスになります.ステータスは200
であるため、検索エンジンがそれらのページにもインデックスを付ける可能性があります.予想される動作:
ステータス
404 Not Found
を送信したい.