404 wird erwartet, aber mit dem URL-Unterverzeichnis im Beitragstitel weitergeleitet

Ich sehe etwas Unerwartetes, obwohl ich nicht sicher bin, ob es eine function ist, die ich deaktivieren kann oder ob es etwas ist, das durch das benutzerdefinierte Thema, das ich verwende, eingeführt wird, das ich aufspüren muss.

Wenn ich eine URL für eine nicht existierende Seite, zB mysite.com/london, eintrage, wird vor dem Werfen eines 404 nach einem Beitrag mit einem Titel suchen, der mit “london” beginnt und anzeigen, wenn er es findet, zB mysite.com / veranstaltungen / london-wochenende-party.

(Ich habe eine Reihe verschiedener CPTs, aber diese Umleitung ist CPT-agnostisch, dh es scheint mir egal zu sein, welcher Posttyp ‘London’ im Titel enthält. Wenn ich die CPTs registriere, ist die einzige Rewrite-Regel für den Slug, zB 'rewrite' => array('slug'=>'events' .)

Ich habe das Plug-In Debug This verwendet, um die Rewrite-Regeln zu sehen, aber es hat nicht geholfen, weil es die Regel zu zeigen scheint, die nach dem Rewrite passierte, dh nicht, dass es gegen mysite.com/london sondern gegen die post it found, dh events/([^/]+)(/[0-9]+)?/?$ .

Ich habe das “Problem” nur entdeckt, weil ich untersucht habe, wie 404 abgefangen werden kann, bevor die 404-Vorlage geladen wird, um die URLs gegen eine Whitelist zu prüfen. Wenn ich eine Übereinstimmung für, sagen wir mysite.com/london, bekomme, kann ich etwas London machen -spezifisch vor einer Weiterleitung. Wenn jemand irgendwelche Tipps hat, wo er damit anfangen soll, wäre ich dankbar, sie zu hören. Mein erster Instinkt war $ _GET in wp, aber ich spreche nicht von ?name=value Stil Parameter.

Solutions Collecting From Web of "404 wird erwartet, aber mit dem URL-Unterverzeichnis im Beitragstitel weitergeleitet"

Die Magie, auf die du dich beziehst, passiert in redirect_canonical() . Genauer gesagt redirect_guess_404_permalink() .

Sie können vor redirect_canonical einschneiden, indem Sie die Aktion template_redirect mit einer etwas höheren Priorität – in diesem Fall etwas unter 10 – einhaken.

 function wpse_145210_redirect_canonical() { if ( is_404() && $name = get_query_var( 'name' ) ) { // The following is straight from redirect_guess_404_permalink(), do whatever you want instead! $where = $wpdb->prepare("post_name LIKE %s", like_escape( $name ) . '%'); // if any of post_type, year, monthnum, or day are set, use them to refine the query if ( get_query_var('post_type') ) $where .= $wpdb->prepare(" AND post_type = %s", get_query_var('post_type')); else $where .= " AND post_type IN ('" . implode( "', '", get_post_types( array( 'public' => true ) ) ) . "')"; if ( get_query_var('year') ) $where .= $wpdb->prepare(" AND YEAR(post_date) = %d", get_query_var('year')); if ( get_query_var('monthnum') ) $where .= $wpdb->prepare(" AND MONTH(post_date) = %d", get_query_var('monthnum')); if ( get_query_var('day') ) $where .= $wpdb->prepare(" AND DAYOFMONTH(post_date) = %d", get_query_var('day')); $post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'"); if ( ! $post_id ) return false; if ( get_query_var( 'feed' ) ) $url = get_post_comments_feed_link( $post_id, get_query_var( 'feed' ) ); elseif ( get_query_var( 'page' ) ) $url = trailingslashit( get_permalink( $post_id ) ) . user_trailingslashit( get_query_var( 'page' ), 'single_paged' ); else $url = get_permalink( $post_id ); wp_redirect( $url, 301 ); exit; } } add_action( 'template_redirect', 'wpse_145210_redirect_canonical', 5 );