So erstellen Sie eine Permalink-Struktur mit benutzerdefinierten Taxonomien und benutzerdefinierten Post-Typen wie Basisname / übergeordnete Steuer / untergeordnete Steuer / benutzerdefinierte Post-Typ-Name

Ich habe diese Seite gekämmt und google für die Antwort und ich bin völlig leer ausgegangen. Grundsätzlich möchte ich genau das tun, was dieser Beitrag verlangt, aber ich brauche eine hierarchische Taxonomie. Die Antwort in diesem Beitrag funktioniert großartig, aber nur mit einer Taxonomie auf einer einzigen Ebene. Ist es möglich zu tun, was ich will? Ich habe eine Million Dinge ausprobiert, aber keine funktioniert, bestenfalls kann ich die richtigen Permalinks bekommen, aber sie kommen 404.

Um zu veranschaulichen, was ich will:

/basename/ - ideally a page, but I think this will cause a permalink collision /basename/top-cat/ - top parent custom taxonomy archive /basename/top-cat/child-cat/ - child cat custom taxonomy archive /basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive /basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post 

Sie können das mit den eingebauten Posts und Kategorien gut machen, wie machen Sie das mit benutzerdefinierten Taxonomien und benutzerdefinierten Post-Typen? Ich weiß, dass Sie 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ), , um hierarchische Slugs zu erhalten Archivseiten, aber die Posts des benutzerdefinierten Posttyps kommen 404. Wenn ich den 'hierarchical' => true Teil entferne 'hierarchical' => true dann funktionieren die Posts, aber ich verliere die hierarchischen URLs (nur / Basisname / Enkelkind-Katze / Post-Name / Werke) .

Also, irgendwelche Lösungen? Vielen Dank, das hat mich jetzt seit ungefähr 3 Wochen verrückt gemacht.

Solutions Collecting From Web of "So erstellen Sie eine Permalink-Struktur mit benutzerdefinierten Taxonomien und benutzerdefinierten Post-Typen wie Basisname / übergeordnete Steuer / untergeordnete Steuer / benutzerdefinierte Post-Typ-Name"

Nachdem ich einige weitere Antworten gesammelt hatte, funktionierte es! Also hier ist die Lösung für diejenigen von euch, die auch damit kämpfen:

Dieser Beitrag und dieser hat mir geholfen, danke an diese Leute.

Beachten Sie, dass der gesamte Code sowie der ursprüngliche benutzerdefinierte Post-Typ- und Taxonomie-Registrierungscode in Ihre functions.php Datei eingetragen wird.

Ermitteln Sie zuerst Ihre Slugs, wenn Sie Ihre benutzerdefinierten Post-Typen und -Taxonomien definieren: Für den benutzerdefinierten Post-Typ sollte er basename/%taxonomy_name% und der Slug für Ihre Taxonomie sollte nur basename . Vergessen Sie nicht, dem Array zum Umschreiben der Taxonomie auch 'hierarchical' => true hinzuzufügen 'hierarchical' => true um verschachtelte Terme in Ihrer URL zu erhalten. query_var außerdem sicher, dass query_var in beiden Fällen auf true query_var ist.

Sie müssen eine neue Rewrite-Regel hinzufügen, damit WordPress Ihre URL-Struktur interpretieren kann. In meinem Fall wird der benutzerdefinierte Post-Typ-Teil der uri immer das 5. uri-Segment sein, also 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 verschachtelter Terme haben, müssen Sie eine function schreiben, um zu überprüfen, ob das letzte Uri-Segment ein benutzerdefinierter Posttyp oder ein Taxonomiebegriff ist, um zu wissen, welche Regel hinzugefügt werden soll (fragen Sie mich, wenn 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); } 

Dann müssen Sie diesen Code hinzufügen, um die Verarbeitung von %taxonomy_name% in Ihrer benutzerdefinierten post type rewrite slug structure bearbeiten zu lassen:

 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 function erstellt, die auf WordPress eigenen 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 löschen (laden Sie einfach Ihre Permalinks-Einstellungen Seite).

Jetzt sollte alles hoffentlich funktionieren! Gehen Sie eine Reihe von Taxonomiebegriffen ein und verschachteln Sie sie richtig. Erstellen Sie dann einige benutzerdefinierte Post-Posts und kategorisieren Sie sie korrekt. Sie können auch eine Seite mit dem Slug- 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 zu steuern, wie sie aussehen, und ein Taxonomie-Widget- Plug-in hinzuzufügen, um Ihre verschachtelten Kategorien in der Seitenleiste anzuzeigen.

Hoffe das hilft dir!

Schau dir dieses Plugin an . Es bietet hierarchische URLs für Kategorien, aber Sie können sich leicht an jede Taxonomie anpassen.

Die Regelerzeugung folgt einer rekursiven function .