Come faccio a disattivare i post di reindirizzamento 301 (non canonico)?
2 risposta
- voti
-
- 2012-03-10
Questo sembra avere a chefare con
redirect_guess_404_permalink()
chiamato sulla riga 96 diwp-includes/canonical.php
. Solopertestare,ho aggiunto unreturn false;
allaprima riga dellafunzioneredirect_guess_404_permalink()
e questo sembravafermare questo strano comportamento. Sto curiosando unpo ',mafinoranon vedo unmodo buono per risolvere questoproblema senzamodificareilfileprincipale di WordPress (cosa chepersonalmente sono contrario afarein un ambiente diproduzione,poiché rendegli aggiornamenti dibasepiù difficilie soggetti aincidenti). Vorrei che cifosse unbuonfiltro/hook di azione da usareinredirect_guess_404_permalink
per abbreviare questo comportamento. Continuerò afrugare unpo 'e ad aggiornare questa risposta setrovo unabuona soluzione.<"EDIT"
Potrei avertrovato una soluzione,che hotestatobrevementee hafunzionato.
Modifica (dinuovo) Aggiunta della logica (che replicai controllieffettuatiin canonical.php pereseguireil reindirizzamento)per verificare alcuniparametri di query. Non cosìtestato come l'ultimamodifica,quindifammi sapere comefunziona. Senonfunziona al 100%,dovrebbe almenoportartinellagiusta direzione (e controllare canonical.php ).
add_action('template_redirect', 'remove_404_redirect', 1); function remove_404_redirect(){ if (is_404()){ $id = max(get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id')); $redirect_url = false; if ($id && $redirect_post = get_post($id)) { $post_type_obj = get_post_type_object($redirect_post->post_type); if ($post_type_obj->public) $redirect_url = get_permalink($redirect_post); } if (!$redirect_url) remove_filter('template_redirect', 'redirect_canonical'); } }
Questofunzioneràperchéi reindirizzamentiindesiderati si verificano solo se lapagina èinizialmente un 404,quindi controlliamo solo 404e,se lo è,rimuoviamoilfiltro di reindirizzamento. YAY!
This appears to have to do with
redirect_guess_404_permalink()
called on line 96 ofwp-includes/canonical.php
. Just to test, I added areturn false;
to the first line of theredirect_guess_404_permalink()
function, and that seemed to stop this odd behavior. I'm poking around a bit, but so far I don't see a good way to fix this without editing that core WordPress file (which I am personally opposed to doing in a production environment, since it makes core updates more difficult and accident prone). I wish there was a good filter/action hook to use inredirect_guess_404_permalink
to shortcut this behavior. I'll keep poking a bit and update this answer if I find a good solution.EDIT
I may have found a fix, which I tested briefly and worked.
Edit (again) Added some logic (which replicates the checks done in canonical.php to perform the redirect) to check for certain query parameters. Not as well tested as the last edit, so let me know how it works. If not 100% working, it should at least get you in the right direction (and check canonical.php).
add_action('template_redirect', 'remove_404_redirect', 1); function remove_404_redirect(){ if (is_404()){ $id = max(get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id')); $redirect_url = false; if ($id && $redirect_post = get_post($id)) { $post_type_obj = get_post_type_object($redirect_post->post_type); if ($post_type_obj->public) $redirect_url = get_permalink($redirect_post); } if (!$redirect_url) remove_filter('template_redirect', 'redirect_canonical'); } }
This will work because the undesired redirects are only occurring if the page is initially a 404, so we just check for 404 and, if it is, remove the redirecting filter. YAY!
-
Eccezionale!Grazieper averlo scoperto - ho scavatoper unpo 'manon sono riuscito atrovarlo.Una soluzioneelegante sembra spettacolare.Awesome! Thanks for finding that - I dug for a while but wasn't able to find it. An elegant solution sounds spectacular.
- 0
- 2012-03-16
- Alex Cook
-
Ehi @AlexCook,controlla lamiamodifica della risposta.Penso che dovrebbefunzionareper risolvere questoproblema.Hey @AlexCook , check my edit of the answer. I think that should work to fix this issue.
- 0
- 2012-03-16
- William
-
Sembra che stia usando questoinoltro rotto? P=xxx,che èpotenzialmente ungrossoproblema.Quando ho aggiunto questo hack,haimpedito a queitipi diforward difunzionare.Looks like using this broke ?p=xxx forwarding, which is potentially a big issue. When I added this hack, it prevented those types of forwards from working.
- 0
- 2012-03-20
- Alex Cook
-
@AlexCook Buonapresa,ho aggiornato dinuovo lamia risposta.Sebbenenon sia cosìelegante,dovrebbe risolvere questoproblema.Replicapiùesattamentei controllieffettuatiin `canonical.php`nel controllo`is_404 () `intorno alla riga 83. Spero che lo risolvaper sempre :)@AlexCook Good catch, I updated my answer again. While not as elegant, it should resolve this issue. It replicates more exactly the checks done in `canonical.php` in the `is_404()` check around line 83. Hope that fixes it for good :)
- 0
- 2012-03-21
- William
-
- 2014-03-25
Ecco una versionepiù semplice.Disattivail reindirizzamento solo senessuna delle query_vars èpresente.In questomodo si arriva amantenere lafunzionalità,senza lanecessità di duplicare la logicagiàpresentein redirect_canonical.
add_filter('redirect_canonical', 'no_redirect_on_404', 10, 2); function no_redirect_on_404($redirect_url, $requested_url){ $id = max(get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id'), get_query_var('day'), get_query_var('monthnum'), get_query_var('year')); if (is_404() && !$id){ return false; } return $redirect_url; }
Here's a simpler take. Only turn off the redirecting if none of the query_vars are present. In this way we get to keep the functionality, without the need to duplicate the logic already at redirect_canonical.
add_filter('redirect_canonical', 'no_redirect_on_404', 10, 2); function no_redirect_on_404($redirect_url, $requested_url){ $id = max(get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id'), get_query_var('day'), get_query_var('monthnum'), get_query_var('year')); if (is_404() && !$id){ return false; } return $redirect_url; }
Honotato uno strano comportamentoin WordPressin cui reindirizza automaticamente 301 determinate strutture URLperi post.
Adesempio,ho unpostper: miosito.com/999/about-us
Quindi,potrestipensare cheil seguente linkproduca un 404: miosito.com/567891/about-us-1
Tuttavia,WordPress reindirizza automaticamente a/999/about-us
C'è unmodoper disattivare questotipo specifico di reindirizzamento?Sembra che WP stia cercando la lumaca "simile"più vicina.Nota chenon ho vociper about-us-1nellatabella deipost,né revisioni o altro chepotrebbe causare l'inoltro di WPin questomodo.
Hotrovato questo snippit che disattivai reindirizzamenti 301 canonici:
Tuttavia,questanon è la soluzioneperchéproduce strutture URLindesiderate sul sito.