Ich versuche, eine mehrstufige benutzerdefinierte Posttypstruktur mit Permalinks einzurichten, die so aussehen authors/books/chapters
, dass Autoren, Bücher und Kapitel als eigene benutzerdefinierte Posttypen eingerichtet sind. Beispielsweise könnte eine typische URL auf dieser Site so aussehenexample.com/authors/stephen-king/the-shining/chapter-3/
Jedes Kapitel kann nur zu einem Buch gehören, und jedes Buch kann nur einem Autor gehören. Ich habe überlegt, Taxonomien anstelle von CPTs für Autoren und Bücher zu verwenden, aber ich muss jedem Element Metadaten zuordnen, und ich bevorzuge hierfür die Post-Oberfläche.
Ich bin meistens auf dem Weg dorthin, indem ich einfach jeden benutzerdefinierten Beitrag als untergeordnetes Element eines Eintrags im CPT eine Ebene höher einrichte. Zum Beispiel erstelle ich "Kapitel 3" und weise "The Shining" als übergeordnetes Element mithilfe einer benutzerdefinierten Meta-Box zu. "The Shining" wiederum hat "Stephen King" als Elternteil. Ich hatte keine Probleme, diese Beziehungen aufzubauen.
Ich verwende Rewrite-Tags in den CPT-Slugs und die Permalinks möchten funktionieren, aber sie sind nicht ganz richtig. Mit einem Re-Write-Analysator kann ich sehen, dass die Rewrite-Regeln tatsächlich generiert werden, aber sie scheinen nicht in der richtigen Reihenfolge zu sein, sodass andere Regeln zuerst verarbeitet werden.
So habe ich meine CPTs registriert:
function cpt_init() {
$labels = array(
'name' => 'Authors'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author',
'with_front' => FALSE,
),
'with_front' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('authors',$args);
$labels = array(
'name' => 'Books'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author/%authors%',
'with_front' => FALSE,
),
'with_front' => false,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('books',$args);
$labels = array(
'name' => 'Chapters'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array(
'slug' => 'author/%authors%/%books%',
'with_front' => FALSE,
),
'with_front' => FALSE,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => null,
'supports' => array( 'title', 'editor' )
);
register_post_type('chapters',$args);
}
add_action( 'init', 'cpt_init' );
Gibt es also eine Möglichkeit, die Priorität meiner Umschreiberegeln so zu ändern, dass Autoren, Bücher und Kapitel zuerst übereinstimmen?
Ich weiß auch, dass ich einen post_type_link
Filter hinzufügen muss , aber das scheint zweitrangig zu sein, wenn man die Permalinks überhaupt richtig macht. Wenn jemand weiß, wo ich einen umfassenden Überblick über die Funktionsweise dieses Filters finden kann, wäre er dankbar.
Antworten:
Wenn Sie "Autoren" als Basis-Slug in den Permalinks behalten möchten, z. B. example.com/authors/stephen-king/ für das CPT "Autoren", example.com/authors/stephen-king/the-shining/ für das "Bücher" CPT und example.com/authors/stephen-king/the-shining/chapter-3/ für das CPT "Kapitel", WordPress wird denken, dass so ziemlich alles ein "Autoren" -Post oder ein hierarchisches Kind eines "Autors" ist 'post und da dies nicht der Fall ist, wird WordPress letztendlich sehr verwirrt.
Trotzdem gibt es eine Problemumgehung, die recht einfach ist, aber solange Ihre Permalink-Struktur immer der gleichen Reihenfolge folgt, dh auf das Wort "Autoren" folgt immer eine Autoren-Schnecke, auf die immer eine Buch-Schnecke folgt Wenn Sie eine Kapitelschnecke haben, sollten Sie bereit sein, loszulegen.
In dieser Lösung ist es nicht erforderlich, den Umschreibungs-Slug in der benutzerdefinierten Post-Typ-Definition für "Kapitel" und "Bücher" zu definieren. Legen Sie jedoch den "Autoren" -Rewrite-Slug einfach als "Autoren" fest. Fügen Sie den folgenden Code in Ihre functions.php ein Datei und "leeren" Sie Ihre Umschreiberegeln.
Erfahren Sie mehr über das CPT-Onomies-Plugin
quelle
Ich habe keine persönlichen Erfahrungen mit einem solchen Szenario, aber Randy Hoyt hat am vergangenen Wochenende im WordCamp San Fran eine Präsentation über "Subordinate Post Types" gehalten, die so klingt, als würden Sie darüber sprechen.
Hier ist seine Seite für den Vortrag, der seine Präsentationsfolien und Links zu einem Plugin enthält, das er für die Arbeit mit untergeordneten Beitragstypen erstellt hat: http://randyhoyt.com/wordpress/subordinate-post-types/
quelle
Die Regeln werden dem extra_rules_top von WP_Rewrite in der Reihenfolge hinzugefügt, in der die zusätzlichen Permastrukturen hinzugefügt werden. Wenn Sie also die Reihenfolge ändern, in der Sie die Beitragstypen registrieren, wird die Reihenfolge der generierten Umschreiberegeln geändert, sodass das Umschreiben des Kapitels zuerst übereinstimmt. Da Sie jedoch die query_var aus den anderen post_types verwenden, stimmt die wp_query möglicherweise mit einer dieser Abfragen als abgefragter Postname überein, bevor sie dem gewünschten Kapitel entspricht.
Ich würde neue Umschreibetags erstellen, um die Platzhalter für den übergeordneten Autor und das übergeordnete Buch darzustellen, dh:
Wenn Sie dies tun, müssen Sie 'query_vars' filtern, um 'parent_book' öffentlich zu machen. Dann müssen Sie pre_get_posts einen Filter hinzufügen, der den als parent_book query_var festgelegten Namen in die post_id konvertiert und als 'post_parent' festlegt.
quelle