Schreiben Sie die WordPress-URL neu, um CPT-Metadaten anzuzeigen

Ich bin auf der Suche nach einer Rewrite-Regel. Ich habe einen benutzerdefinierten Post-Typ für ‘Bücher’ eingerichtet, jedes Buch hat ein wiederholbares Feld (mit ACF Pro) für Kapitel.

Ich habe eine query_var für chapter mit dem folgenden Code hinzugefügt …

 // Add chapter to query vars array function add_query_vars_filter( $vars ){ $vars[] = "chapter"; return $vars; } add_filter( 'query_vars', 'add_query_vars_filter' ); 

Auf der Template-Seite single-books.php ich einen Code, um query_var zu erfassen und entweder die query_var oder die Kapitelmetafelder anzuzeigen …

 if (get_query_var('chapter') == '') { // show book title and content } elseif (get_query_var('chapter') >= 1) { $chapter_no = (get_query_var( 'chapter', 1 ) - 1); //minus one as first array row has index of 0. $rows = get_field('chapter'); // get all the rows $chapter = $rows[$chapter_no]; // get the row given from query_var // show chapter fields from ACF array. // $chapter['title'] // $chapter['content'] // $chapter['image'] }; 

Also würde die URL für Kapitel 1 so aussehen …

www.example.com/books/book-title/?chapter=1

Das funktioniert gut, aber für SEO-Zwecke möchte ich, dass die URL hübscher aussieht, wie im Beispiel unten …

www.example.com/books/book-title/1/chapter-title/

Ich habe mir den Codex angeschaut und folgendes versucht …

 function custom_rewrite_basic() { add_rewrite_rule('^books/([^/]*)/([0-9]+)/?', 'index.php?post_type=books&chapter=$matches[1]', 'top'); } add_action('init', 'custom_rewrite_basic'); 

Ich bekomme nichts davon, nicht wirklich sicher, was ich tun muss / wenn es möglich ist. Kann mir jemand in die richtige Richtung zeigen oder mir zeigen, wie man die Rewrite-Regel erstellt.

Vielen Dank.

Solutions Collecting From Web of "Schreiben Sie die WordPress-URL neu, um CPT-Metadaten anzuzeigen"

Der Abfragetyp var des Posttyps ist standardmäßig derselbe wie der Posttyp slug. Ungetestet, aber das sollte funktionieren

 function custom_rewrite_basic() { add_rewrite_rule( '^books/([^/]+)/([0-9]+)/([^/]+)/?', 'index.php?books=$matches[1]&chapter=$matches[2]', 'top' ); } add_action('init', 'custom_rewrite_basic'); 

$matches[3] enthält den Chapter Slug, aber wenn Sie das Kapitel nicht benötigen, müssen Sie es nicht setzen.

Rewrite-Regeln müssen gelöscht werden, nachdem sie hinzugefügt / geändert wurden. flush_rewrite_rules Sie die Seite Einstellungen> Permalinks aufrufen, werden diese flush_rewrite_rules ohne dass Sie flush_rewrite_rules selbst aufrufen flush_rewrite_rules .

Rewrite-Regeln behandeln nur eingehende Anfragen. Es liegt an Ihnen, die korrekten URLs für jedes Kapitel zu generieren, aber das sollte nur darauf ankommen, Ihre Kapiteldaten zu erfassen und die Zahlen / Titel an den Post-Permalink anzuhängen. Etwas wie das:

 $rows = get_field('chapter'); foreach( $rows as $index => $row ){ echo get_permalink() . '/' . ( $index + 1 ) . '/' . sanitize_title( $row['title'] ) . '/'; } 

Um Ihre Templates sauber zu halten, können Sie single_template filtern , prüfen, ob die chapter var gesetzt ist, und eine andere Vorlage für Kapitel vs. die Hauptbuchseite laden.