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!
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; }