Die benutzerdefinierte Regel zum Neuschreiben von Postsyntax für WordPress stimmt mit allen Seiten überein, die 404 zurückgeben

Ich habe einen benutzerdefinierten Beitragstyp mit einer Neuschreibung erstellt, um die Großelternbeziehung als URL zu verwenden:

function cpt_child(){ $args = array( //code 'rewrite' => array( 'slug' => '%grandparent%/%parent%', 'with_front' => false), ); register_post_type( 'child', $args ); } add_action( 'init', 'cpt_child' ); 

Dann aktualisiere ich den Permalink:

 add_filter( 'post_type_link', 'filter_the_post_type_link', 1, 2 ); function filter_the_post_type_link( $post_link, $post ) { switch( $post->post_type ) { case 'child': $post_link = get_bloginfo( 'url' ); $relationship_child = p2p_type('children_to_parents')->get_adjacent_items($post->ID); $parent = $relationship['parent']->post_name; $relationship_parent = p2p_type('parents_to_grandparents')->get_adjacent_items($parent['parent']->ID); $grandparent = $relationship_parent['parent']->post_name; $post_link .= "/{$grandparent}/"; $post_link .= "{$parent}/"; $post_link .= "{$post->post_name}"; break; } return $post_link; } 

Das alles funktioniert super, aber leider passt die Rewrite-Regel auch auf reguläre Seiten, was sie zu 404 macht.

Ich kann dies verhindern, indem ich einen benutzerdefinierten Slug hinzufüge, zum Beispiel ‘Beziehung’: http://example.com/relationship/grandparent/parent/child

Aber ich würde gerne http://example.com/grandparent/parent/child und nicht normale Seiten brechen.

Abfrage-Debugging:

CPT-Neuschreiben aktiv und CPT-Neuschreibungen funktionieren, aber Seiten brechen

 Request: test Query String: name=test Matched Rewrite Rule: ([^/]+)(?:/([0-9]+))?/?$ Matched Rewrite Query: name=test&page= 

CPT Neuschreiben inaktiv und Seiten funktionieren (normal)

 Request: account-information Query String: pagename=account-information Matched Rewrite Rule: (.?.+?)(?:/([0-9]+))?/?$ Matched Rewrite Query: pagename=account-information&page= 

Danke im Voraus!

Solutions Collecting From Web of "Die benutzerdefinierte Regel zum Neuschreiben von Postsyntax für WordPress stimmt mit allen Seiten überein, die 404 zurückgeben"

Dank Milos früheren Antworten auf andere Fragen konnte ich eine Lösung finden. Ich habe diesen speziellen Artikel gefunden. Entfernen Sie den Basis-Slug in CPT & CT, verwenden Sie CT in Permalink , um extrem hilfreich zu sein.

Meine ursprüngliche CPT mit der Umschreibung der Großelternbeziehung bleibt gleich:

 function cpt_child(){ $args = array( //code 'rewrite' => array( 'slug' => '%grandparent%/%parent%', 'with_front' => false), ); register_post_type( 'child', $args ); } add_action( 'init', 'cpt_child' ); 

Dann aktualisiere ich den Permalink:

 add_filter( 'post_type_link', 'filter_the_post_type_link', 1, 2 ); function filter_the_post_type_link( $post_link, $post ) { switch( $post->post_type ) { case 'child': $post_link = get_bloginfo( 'url' ); $relationship_child = p2p_type('children_to_parents')->get_adjacent_items($post->ID); $parent = $relationship['parent']->post_name; $relationship_parent = p2p_type('parents_to_grandparents')->get_adjacent_items($parent['parent']->ID); $grandparent = $relationship_parent['parent']->post_name; $post_link .= "/{$grandparent}/"; $post_link .= "{$parent}/"; $post_link .= "{$post->post_name}"; break; } return $post_link; } 

An Nachfrage angehängt und Abfrage basierend auf Anfrage geändert, die meinen Anforderungen entspricht. is_admin() um zu verhindern, dass der Anforderungsfilter das Back-End des CPT ändert.

 // URL rewrite pages 404 fix if ( ! is_admin() ) { function svbr_fix_requests( $request ){ // if it's not a section request and request is not empty treat request as page or post if( ( ! array_key_exists( 'section' , $request ) ) && ( ! empty($request) ) ){ $request['post_type'] = array( 'post', 'page' ); } // return request vars return $request; } add_filter( 'request', 'svbr_fix_requests' ); } 

Da wir die Abfragevariablen geändert haben, müssen wir die Vorlagenfunktionalität hinzufügen.

 // Use single_template filter to properly redirect to page.php and custom page templates function svbr_get_template_file($single_template) { global $post; $page_custom_template = get_post_meta( $post->ID, '_wp_page_template', true ); if ($post->post_type == 'page') { if($page_custom_template != 'default') { // We are using a child theme, so get_stylesheet_directory() $single_template = get_stylesheet_directory() . '/' . $page_custom_template; } else { $single_template = get_template_directory() . '/page.php'; } } return $single_template; } add_filter( 'single_template', 'svbr_get_template_file' ); 

Last but not least müssen wir die Template-class zum Styling hinzufügen.

 // Add template class to body add_filter( 'body_class', 'template_class_name' ); function template_class_name( $classes ) { global $post; $page_custom_template = get_post_meta( $post->ID, '_wp_page_template', true ); $page_custom_template = str_replace('.php','',$page_custom_template); $page_custom_template = 'page-template-' . $page_custom_template; // add 'class-name' to the $classes array $classes[] = $page_custom_template; // return the $classes array return $classes; }