Nachdem ich einige andere Antworten kombiniert hatte, funktionierte es! Hier ist die Lösung für diejenigen unter Ihnen, die auch damit zu kämpfen haben:
Dieser und dieser Beitrag haben mir geholfen, also vielen Dank an diese Leute.
Beachten Sie, dass der gesamte Code sowie Ihr ursprünglicher benutzerdefinierter Beitragstyp und Taxonomie-Registrierungscode in Ihrer functions.php
Datei enthalten sind.
Achten Sie beim Definieren Ihrer benutzerdefinierten Beitragstypen und Taxonomien zuerst darauf, dass Ihre Slugs richtig sind: Für den benutzerdefinierten Beitragstyp sollte dies der Fall sein, basename/%taxonomy_name%
und für Ihre Taxonomie sollte der Slug der richtige Wert sein basename
. Vergessen Sie nicht 'hierarchical' => true
, das Array zum Umschreiben der Taxonomie zu ergänzen , um verschachtelte Begriffe in Ihrer URL zu erhalten. Stellen Sie außerdem sicher query_var
, dass true
in beiden Fällen auf eingestellt ist.
Sie müssen eine neue Umschreiberegel hinzufügen, damit WordPress Ihre URL-Struktur interpretieren kann. In meinem Fall ist der benutzerdefinierte Beitragstyp-Teil des URI immer das 5. URI-Segment, daher habe ich meine Übereinstimmungsregel entsprechend definiert. Beachten Sie, dass Sie dies möglicherweise ändern müssen, wenn Sie mehr oder weniger Uri-Segmente verwenden. Wenn Sie unterschiedliche Ebenen von verschachtelten Begriffen haben, müssen Sie eine Funktion schreiben, um zu überprüfen, ob das letzte URI-Segment ein benutzerdefinierter Beitragstyp oder ein Taxonomiebegriff ist, um zu wissen, welche Regel hinzugefügt werden muss (fragen Sie mich, ob Sie Hilfe benötigen) Das).
add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules = array();
$newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
$newRules['basename/(.+)/?$'] = 'index.php?taxonomy_name=$matches[1]';
return array_merge($newRules, $rules);
}
Anschließend müssen Sie diesen Code hinzufügen, damit Workpress weiß, wie mit %taxonomy_name%
Ihrer benutzerdefinierten Slug-Struktur für das Umschreiben von Posts umzugehen ist :
function filter_post_type_link($link, $post)
{
if ($post->post_type != 'custom_post_type_name')
return $link;
if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
{
$link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below
}
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);
Ich habe eine benutzerdefinierte Funktion erstellt, die auf der eigenen von Wordpress basiert get_category_parents
:
// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {
$chain = '';
$parent = &get_term($id, $taxonomy);
if (is_wp_error($parent)) {
return $parent;
}
if ($nicename)
$name = $parent -> slug;
else
$name = $parent -> name;
if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {
$visited[] = $parent -> parent;
$chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);
}
if ($link) {
// nothing, can't get this working :(
} else
$chain .= $name . $separator;
return $chain;
}
Dann müssen Sie Ihre Permalinks leeren (laden Sie einfach die Seite mit den Einstellungen für Permalinks).
Jetzt sollte hoffentlich alles funktionieren! Erstellen Sie eine Reihe von Taxonomiebegriffen und verschachteln Sie sie richtig. Erstellen Sie dann benutzerdefinierte Posts und kategorisieren Sie sie richtig. Sie können auch eine Seite mit der Schnecke erstellen basename
, und alles sollte so funktionieren, wie ich es in meiner Frage angegeben habe. Möglicherweise möchten Sie einige benutzerdefinierte Taxonomie-Archivseiten erstellen, um deren Aussehen zu steuern, und eine Art Taxonomie-Widget- Plugin hinzufügen , um Ihre verschachtelten Kategorien in der Seitenleiste anzuzeigen.
Hoffe das hilft dir!