it-swarm.com.de

Wie deaktiviere ich 301 umleitende Posts (nicht kanonisch)?

Ich habe in WordPress ein merkwürdiges Verhalten festgestellt, bei dem es bestimmte URL-Strukturen für Posts automatisch umleitet.

Ich habe zum Beispiel einen Beitragseintrag für: mysite.com/999/about-us

Dann würden Sie denken, der folgende Link würde einen 404 erzeugen: mysite.com/567891/about-us-1

WordPress leitet jedoch automatisch zu/999/about-us weiter

Gibt es eine Möglichkeit, diese bestimmte Art der Weiterleitung zu deaktivieren? Es scheint, als ob WP nach der nächsten "like" -Schnecke sucht. Beachten Sie, dass ich keine Einträge für about-us-1 in der Posts-Tabelle habe und keine Revisionen oder andere Elemente, die dazu führen würden, dass WP so weitergeleitet wird.

Ich habe diesen Snippit gefunden, der kanonische 301-Weiterleitungen deaktiviert:

remove_filter('template_redirect','redirect_canonical');

Dies ist jedoch nicht die Lösung, da es unerwünschte URL-Strukturen auf der Site erzeugt.

3
Alex Cook

Dies hat anscheinend mit der in Zeile 96 von wp-includes/canonical.php aufgerufenen redirect_guess_404_permalink() zu tun. Nur zum Testen habe ich der ersten Zeile der Funktion redirect_guess_404_permalink() einen return false; hinzugefügt, und das schien dieses seltsame Verhalten zu stoppen. Ich stöbere ein bisschen herum, aber bis jetzt sehe ich keinen guten Weg, dies zu beheben, ohne diese zentrale WordPress-Datei zu bearbeiten (was ich persönlich in einer Produktionsumgebung ablehne, da es macht Kernupdates schwieriger und unfallanfälliger). Ich wünschte, es gäbe einen guten Filter-/Aktions-Hook, der in redirect_guess_404_permalink verwendet werden könnte, um dieses Verhalten zu verkürzen. Ich werde ein bisschen weiter stöbern und diese Antwort aktualisieren, wenn ich eine gute Lösung finde.

EDIT

Möglicherweise habe ich einen Fix gefunden, den ich kurz getestet und bearbeitet habe.

Edit (again) Es wurde eine Logik hinzugefügt (die die in canonical.php durchgeführten Überprüfungen repliziert, um die Umleitung durchzuführen), um nach bestimmten Abfrageparametern zu suchen. Nicht so gut getestet wie die letzte Bearbeitung, also lass mich wissen, wie es funktioniert. Wenn es nicht zu 100% funktioniert, sollte es dich zumindest in die richtige Richtung bringen (und überprüfe 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');
  }
}

Dies funktioniert, da die unerwünschten Weiterleitungen nur auftreten, wenn die Seite anfangs eine 404-Seite ist. Wir überprüfen daher nur die 404-Seite und entfernen, falls dies der Fall ist, den Umleitungsfilter. YAY!

4
William

Hier ist eine einfachere Einstellung. Deaktivieren Sie die Umleitung nur, wenn keine der query_vars vorhanden ist. Auf diese Weise bleibt die Funktionalität erhalten, ohne dass die Logik bereits bei redirect_canonical dupliziert werden muss.

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