Come forzare un 404 su WordPress
-
-
Dalle _ domande correlate: _ http://wordpress.stackexchange.com/questions/73738/how-do-i-programmatical-generate-a-404 - l'hai letto?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
-
Sì,ottengo ancora uno stato "200" con quello.Yes, I still get a status `200` with that.
- 0
- 2013-03-22
- RRikesh
-
6 risposta
- voti
-
- 2013-03-24
Potrestiprovare lafunzione Wordpress
status_header()
per aggiungere l'intestazioneHTTP/1.1 404 Not Found
;Quindiiltuoesempio di Codice 2 sarebbe:
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' );
Questafunzione viene utilizzata adesempioin questaparte:
function handle_404() { ...cut... // Guess it's time to 404. $wp_query->set_404(); status_header( 404 ); nocache_headers(); ...cut... }
dalla classe
wp
in/wp-includes/class-wp.php
.Quindiprova a utilizzare questoesempio di Codice 2 modificato oltre altuo codice
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.-
Lo snippet di "Codice 2" che haipubblicatofunzionaperfettamente.Quello chemancavaera `set_header ()`.The `Code 2` snippet you posted works perfectly. The `set_header()` was what was missing.
- 0
- 2013-03-25
- RRikesh
-
@birgireti riferisci a `set_header ()`per aggiungere `HTTP/1.1 404 Not Found`ma hai usato` status_header () `neltuo codice?@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 sembra unerrore dibattitura lì,ho aggiornato la risposta,grazie ;-)@henrywright it looks like a typo there, I updated the answer, thanks ;-)
- 0
- 2014-09-08
- birgire
-
- 2013-03-24
Questo codice hafunzionatoperme:
add_action ('wp','force_404'); funzioneforce_404 () { global $ wp_query;//$posts (se richiesto) if (is_page ()) {//latua condizione status_header (404); nocache_headers (); include (get_query_template ('404')); morire(); } }
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(); } }
-
Maneggevole.Sto verificandoi parametri di querypersonalizzati,quindinon sto usando l'azione,ma è unmetodomolto utilenellamia classe diplugin.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
-
Aggiungi quanto segueper correggereiltitolo dellapagina: `global $ 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
Non consiglierei diforzare un 404.
Se seipreoccupatoperi motori di ricerca,perchénon creare unmeta "no-index,no-follow" su quellepaginee bloccarlo con robots.txt?
Questopotrebbeessere unmodomiglioreperbloccare la visualizzazione del contenuto
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; }
Probabilmentepotresti anche usare questometodoper caricare
404.php
mapenso che usare unmodello dipaginapotrebbeessere un'opzionemigliore.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.-
Graziemilleperil collegamento,passeròinvece all'uso di "locate_template ()".Penso che "robots.txt"non sia unmodogarantitoperproteggersi dall'indicizzazione.Alcunimotori di ricercapotrebbero ancora visualizzare lapagina.Voglio che lapagina assomigli a unanormalepagina 404.Inoltrei post verranno aggiunti dinamicamente,lamodifica delfile `robots.txt` aggiungeràpiùproblemi.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
Lamia soluzione:
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(); } }
-
Il reindirizzamentoin caso dierrori èterribileperilposizionamento dellapagina.Mostra semplicemente unmodellonella stessaposizione della richiestanon valida.Ciò che accade quando lofai è cheinizialmenteimposti un 404,quindiil reindirizzamento lo alterain 301 o 302,che quindi reindirizza a unapagina che restituisce 200. Che viene quindiindicizzata daimotori di ricerca come unapagina valida,cheèesplicitamente ciò che OP ha detto dinon volere.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
I codici di stato vengonoinviatinelleintestazioni delle richieste HTTP.Latuafunzione attuale è agganciata a un hook che verrà chiamatotroppotardi.
Dovrestiprovare ad agganciare latuafunzione
rr_404_my_event()
all'azionesend_headers
.Non sono sicuro che a quelpunto siapersinopossibile controllare l'ID delpost,maprovalo:
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; } }
-
Ho corretto alcunierrori di sintassi daituoi codici.Non riesconemmeno a caricareilmiomodello 404 con quello.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
-
Forse,neltuo `404.php`potresti caricare un diverso` header.php`,ades.` `per caricare` header-404.php`.In quell'intestazione,dovresti aggiungere "header ('HTTP/1.0 404 Not Found');"nella sezione "".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
Volevo condividereilmodoin cui ho utilizzato la soluzione contrassegnata
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");
L'hofattoper separare tuttii tipi di utente dall ' amministratore ,in questoprogetto,solo l'amministratorepuò vedere lapagina
author.php
.Spero chepossa aiutare qualcun altro.
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.
Devoforzare un 404 su alcunipostin base alle condizioni. Sono riuscito afarlo (anche senon so se l'hofattonelmodogiusto)e stofacendo caricareilmiomodello
404.php
comeprevisto.Ilmio codice:
Codice 2 da questa domanda correlata - stessoproblema :
Ilmioproblema:
Anche se sembra buono,ottengo lo stato
200 OK
se controllo la scheda di rete. Poiché è uno stato200
,temo che anchei motori di ricercapossanoindicizzare quellepagine.Comportamentoprevisto:
Desidero che vengainviato uno stato
404 Not Found
.