web-dev-qa-db-fra.com

Comment désactiver 301 messages de redirection (non canoniques)?

J'ai remarqué un comportement étrange dans WordPress qui 301 redirige automatiquement certaines structures d'URL pour les publications.

Par exemple, j'ai une entrée de publication pour: mysite.com/999/about-us

Ensuite, vous pourriez penser que le lien suivant produira un 404: mysite.com/567891/about-us-1

Cependant, WordPress redirige automatiquement vers/999/about-us

Existe-t-il un moyen de désactiver ce type de redirection spécifique? Il semble que WP cherche le slug "comme" le plus proche. Notez que je n'ai aucune entrée pour about-us-1 dans la table posts, ni aucune révision ni quoi que ce soit qui ferait que WP soit transféré comme ceci.

J'ai trouvé cet extrait qui désactive les redirections canoniques 301:

remove_filter('template_redirect','redirect_canonical');

Cependant, ce n'est pas la solution car cela produit des structures d'URL indésirables sur le site.

3
Alex Cook

Cela semble avoir à voir avec redirect_guess_404_permalink() appelé à la ligne 96 de wp-includes/canonical.php. Juste pour tester, j'ai ajouté un return false; à la première ligne de la fonction redirect_guess_404_permalink(), et cela a semblé arrêter ce comportement étrange. Je fouille un peu, mais je ne vois pas encore de solution bien sans modifier ce fichier WordPress principal (ce que je suis personnellement opposé à l'idée de faire dans un environnement de production, car cela rend mises à jour de base plus difficiles et sujettes aux accidents). J'aimerais qu'il y ait un bon crochet filtre/action à utiliser dans redirect_guess_404_permalink pour raccourcir ce comportement. Je vais continuer à piquer un peu et mettre à jour cette réponse si je trouve une bonne solution.

EDIT

J'ai peut-être trouvé une solution que j'ai testée brièvement et qui a fonctionné.

Edit (again) Ajout d'une logique (qui reproduit les vérifications effectuées dans canonical.php pour effectuer la redirection) afin de vérifier certains paramètres de requête. Pas aussi bien testé que le dernier montage, alors laissez-moi savoir comment cela fonctionne. Si vous ne travaillez pas à 100%, vous devriez au moins vous orienter dans la bonne 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');
  }
}

Cela fonctionnera, car les redirections indésirables ne se produisent que si la page est initialement un 404; nous vérifions donc simplement 404 et, le cas échéant, supprimons le filtre de redirection. YAY!

4
William

Voici une prise plus simple. N'activez la redirection que si aucun des query_vars n'est présent. De cette façon, nous gardons la fonctionnalité, sans avoir à dupliquer la logique déjà chez 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;
}
2
Manuel Razzari