Comment désactiver les publications de redirection 301 (non canoniques)?
2 réponses
- votes
-
- 2012-03-10
Cela semble avoir à voir avec
redirect_guess_404_permalink()
appelé à la ligne 96 dewp-includes/canonical.php
. Justepourtester,j'ai ajouté unreturn false;
à lapremière ligne de lafonctionredirect_guess_404_permalink()
,et cela semblait arrêter ce comportement étrange. Jefouille unpeu,maisjusqu'àprésent,je ne voispas de bon moyen de résoudre ceproblème sansmodifier cefichier WordPressprincipal (ce queje suispersonnellement opposé àfaire dans unenvironnement deproduction,caril rend lesmises àjourprincipalesplus difficileset sujettes aux accidents). J'aurais aimé qu'il y ait unbon hook defiltre/action à utiliser dansredirect_guess_404_permalink
pour raccourcir ce comportement. Je vais continuer àpousser unpeuet mettre àjour cette réponse sije trouve unebonne solution.< EDIT
J'aipeut-êtretrouvé un correctif,quej'aibrièvementtestéet travaillé.
Modifier (ànouveau) Ajout d'une logique (qui reproduit les vérificationseffectuées dans canonical.php poureffectuer la redirection)pour vérifier certainsparamètres de requête. Pas aussibien testé que la dernière édition,alors dites-moi comment celafonctionne. Si celane fonctionnepas à 100%,cela devrait aumoins vous amener dans labonne direction (et vérifiez 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'); } }
Celafonctionnera car les redirectionsindésirablesne seproduisent que si lapageestinitialement un 404,doncnous vérifions simplement 404et,si c'est le cas,supprimons lefiltre de redirection. OUI!
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!
-
Impressionnant!Merci d'avoirtrouvé ça -j'ai creusépendant unmomentmaisje n'aipaspu letrouver.Une solution élégante semble spectaculaire.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
-
Salut @AlexCook,vérifiezmamodification de la réponse.Jepense que cela devraitfonctionnerpour résoudre ceproblème.Hey @AlexCook , check my edit of the answer. I think that should work to fix this issue.
- 0
- 2012-03-16
- William
-
On dirait que vous utilisez cetransfert cassé? P=xxx,ce quiestpotentiellement ungrosproblème.Lorsquej'ai ajouté ce hack,cela aempêché cestypes detransferts defonctionner.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 Bonneprise,j'ai ànouveaumis àjourma réponse.Bien quepas aussi élégant,il devrait résoudre ceproblème.Il répliqueplusexactement les vérificationseffectuées dans `canonical.php` dans la vérification`is_404 () `autour de la ligne 83. J'espère que cela corrige leproblèmepour debon :)@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
Voici unepriseplus simple.Ne désactivez la redirection que si aucun des query_varsn'estprésent.De cettefaçon,nous conservons lafonctionnalité,sans avoirbesoin de dupliquer la logique déjà à 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; }
J'ai remarqué un comportement étrange dans WordPress oùil redirige automatiquement 301 certaines structures d'URLpour les articles.
Parexemple,j'ai uneentrée demessagepour: mysite.com/999/about-us
Ensuite,vouspenseriez que le lien suivantproduirait un 404: mysite.com/567891/about-us-1
Cependant,WordPress redirige automatiquement vers/999/about-us
Existe-t-il unmoyen de désactiver cetype spécifique de redirection?Il semble que WP recherche le slug "comme" leplusproche.Notez queje n'aipas d'entréespour about-us-1 dans letableau desmessages,et aucune révision ou quoi que ce soit quipourrait amener WP àtransférer comme ça.
J'aitrouvé cetextrait de code qui désactive les redirections canoniques 301:
Cependant,cen'estpas la solution car celaproduit des structures d'URLindésirables sur le site.