Comment forcer un 404 sur WordPress
-
-
Àpartir des questions _relatives: _ http://wordpress.stackexchange.com/questions/73738/how-do-i-programmatically-generate-a-404 - avez-vous lu cela?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
-
Oui,j'obtienstoujours un statut «200» avec ça.Yes, I still get a status `200` with that.
- 0
- 2013-03-22
- RRikesh
-
6 réponses
- votes
-
- 2013-03-24
Vouspouvezessayer lafonction Wordpress
status_header()
pour ajouter l'en-têteHTTP/1.1 404 Not Found
;Donc,votreexemple de Code 2 serait:
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' );
Cettefonctionestparexemple utilisée dans cettepartie:
function handle_404() { ...cut... // Guess it's time to 404. $wp_query->set_404(); status_header( 404 ); nocache_headers(); ...cut... }
de la classe
wp
dans/wp-includes/class-wp.php
.Essayez donc d'utiliser cetexemple de Code 2 modifiéen plus de votre code
template_include
.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.-
L'extrait de code «2» que vous avezpubliéfonctionneparfaitement.Le `set_header ()` était ce quimanquait.The `Code 2` snippet you posted works perfectly. The `set_header()` was what was missing.
- 0
- 2013-03-25
- RRikesh
-
@birgire vous vous référez à `set_header ()`pour ajouter `HTTP/1.1 404 Not Found`mais avez utilisé` status_header () `dans votre code?@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 ça ressemble à unefaute defrappe là-bas,j'aimis àjour la réponse,merci ;-)@henrywright it looks like a typo there, I updated the answer, thanks ;-)
- 0
- 2014-09-08
- birgire
-
- 2013-03-24
Ce code afonctionnépourmoi:
add_action ('wp','force_404'); functionforce_404 () { global $ wp_query;//$posts (sinécessaire) if (is_page ()) {//votre condition status_header (404); nocache_headers (); include (get_query_template ('404')); mourir(); } }
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(); } }
-
Pratique.Je vérifie lesparamètres de requêtepersonnalisés,doncje n'utilisepas l'action,mais celaen fait uneméthodetrès utile dansma classe deplugin.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
-
Ajoutez ce qui suitpour corriger letitre de lapage: `global $ wp_query;` `$ wp_query->is_404=vrai;`Add the following to fix the page title: `global $wp_query;` `$wp_query->is_404 = true;`
- 2
- 2016-02-24
- developerbmw
-
- 2013-03-22
Jene recommanderaispas deforcer un 404.
Si lesmoteurs de recherche vousinquiètent,pourquoine pas simplementfaire uneméta "sansindex,pas de suivi" sur cespageset labloquer avec robots.txt?
Celapeut être unmeilleurmoyen d'empêcher le contenu d'être consulté
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; }
Vouspourriezprobablement également utiliser cetteméthodepour charger
404.php
maisje pense que l'utilisation d'unmodèle depagepourrait être unemeilleure option.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.-
Mercibeaucouppour le lien,je vaispasser à l'utilisation de `Locate_template ()` à laplace.Jepense que `robots.txt.`n'estpas unmoyengaranti de seprotéger de l'indexation.Certainsmoteurs de recherchepeuventtoujours récupérer lapage.Je veux que lapage ressemble à unepage 404normale.Deplus,lesmessages vont être ajoutés dynamiquement,lamodification dufichier `robots.txt` ajouteraplus deproblèmes.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
Ma 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(); } }
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(); } }
-
La redirection sur leserreursestterriblepour le classement de votrepage.Affichez simplement unmodèle aumêmeemplacement que lamauvaise demande.Ce qui sepasse lorsque vousfaites cela,c'est que vous définissezinitialement un 404,puis la redirection le changeen 301 ou 302,qui redirigeensuite vers unepage qui renvoie un 200. Celaestensuiteindexépar lesmoteurs de recherche comme unepage valide,ce quiestexplicitement ce que OP a dit qu'ilne voulaitpas.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
Les codes d'état sontenvoyés dans lesen-têtes des requêtes HTTP.Votrefonction actuelleest accrochée à un hook qui sera appelétroptard.
Vous devriezessayer de relier votrefonction
rr_404_my_event()
à l'actionsend_headers
.Jene saispas si à cemoment-làilestmêmepossible de vérifier l'identifiant depublication,maisessayez-le:
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; } }
-
J'ai corrigé certaineserreurs de syntaxe de vos codes.Jene chargemêmepasmonmodèle 404 avec ça.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
-
Peut-être que dans votre `404.php` vouspourriez charger un` header.php` différent,parexemple` `pour charger` header-404.php`.Dans ceten-tête,vous ajouteriez `header ('HTTP/1.0 404 Not Found');` dans la section ``.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
Je voulaispartager lafaçon dontj'ai utilisé la solutionmarquée
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");
J'aifait celapour séparer tous lestypes d'utilisateurs de l ' administrateur ,dans ceprojet,seul l'administrateurpeut voir lapage
author.php
.J'espère que celapourra aider quelqu'un d'autre.
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.
Je doisforcer un 404 sur certainsmessagesen fonction des conditions. J'ai réussi à lefaire (même sije ne saispas sije l'aifait de labonnefaçon)et je suisen train de chargermonmodèle
404.php
commeprévu.Mon code:
Code 2 de cette question connexe -mêmeproblème :
Monproblème:
Bien que cela semble bon,j'obtiens un statut
200 OK
sije vérifie l'onglet réseau. Puisqu'il s'agit d'un statut200
,j'aipeur que lesmoteurs de recherchepuissent égalementindexer cespages.Comportement attendu:
Je souhaite qu'un statut
404 Not Found
soitenvoyé.