So erstellen Sie eine Permalink-Struktur mit benutzerdefinierten Taxonomien und benutzerdefinierten Beitragstypen wie Basisname / Elternsteuer / Kindersteuer / benutzerdefinierter Beitragstypname
3 Antworten
- Stimmen
-
- 2012-01-23
Nachdemicheinige andere Antworten kombiniert hatte,funktioniertees! Hierist die Lösungfür diejenigen unter Ihnen,dieebenfalls damit zu kämpfen haben:
Dieser Beitrag und dieses hatmirgeholfen,also danke Diese Leute.
Beachten Sie,dass diesergesamte Code sowie Ihr anfänglicherbenutzerdefinierter Beitragstyp und Taxonomie-Registrierungscodein Ihrer Datei
functions.php
enthalten sind.Machen Sie zuerst Ihre Slugs richtig,wenn Sie Ihrebenutzerdefinierten Beitragstypen und Taxonomien definieren: Für denbenutzerdefinierten Beitragstyp solltees
basename/%taxonomy_name%
sein und der Slugfür Ihre Taxonomie solltenurbasename
. Vergessen Sienicht,auch'hierarchical' => true
für das Taxonomie-Rewrite-Array,um verschachtelte Begriffein Ihrer URL zuerhalten. Stellen Sie außerdem sicher,dassquery_var
in beiden Fällen auftrue
gesetztist.Siemüsseneine neue Umschreiberegel hinzufügen,damit WordPress weiß,wie Sie Ihre URL-Strukturinterpretieren. Inmeinem Fallist derbenutzerdefinierte Beitragstyp des Uriimmer das 5. Uri-Segment,daher habeichmeine Übereinstimmungsregelentsprechend definiert. Beachten Sie,dass Sie diesmöglicherweise ändernmüssen,wenn Siemehr oder weniger Uri-Segmente verwenden. Wenn Sie unterschiedliche Ebenen verschachtelter Begriffe haben,müssen Sieeine Funktion schreiben,um zu überprüfen,ob das letzte Uri-Segmentein benutzerdefinierter Beitragstyp oderein Taxonomiebegriffist,um zu wissen,welche Regel hinzugefügt werdenmuss (fragen Siemich,ob Sie Hilfebenö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ßendmüssen Sie diesen Code hinzufügen,damit workpress den Umgangmit
%taxonomy_name%
in Ihrerbenutzerdefinierten Slug-Struktur zum Umschreiben von Post-Typenbehandelt: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 habeeine benutzerdefinierte Funktionerstellt,die auf Wordpressseigenen
basiertget_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; }
Dannmüssen Sie Ihre Permalinks leeren (laden Sieeinfach Ihre Permalink-Einstellungsseite).
Jetzt sollte hoffentlich allesfunktionieren! Erstellen Sieeine Reihe von Taxonomiebegriffen und verschachteln Sie sie korrekt. Erstellen Sie danneinige benutzerdefinierte Posts vom Typ "Post" und kategorisieren Sie sie korrekt. Sie können aucheine Seitemit dem Slug
basename
erstellen,und alles sollte sofunktionieren,wieichesin meiner Frage angegeben habe. Möglicherweisemöchten Sieeinige benutzerdefinierte Taxonomie-Archivseitenerstellen,um deren Aussehen zu steuern undeine Art Taxonomie-Widget hinzuzufügen Plugin,um Ihre verschachtelten Kategorienin der Seitenleiste anzuzeigen.Hoffe das hilft dir!
After combining a bunch of pieces of other answers I got it working! So here's the solution for those of you who are struggling with this too:
This post and this one helped me out some, so thanks to those guys.
Note, all this code, plus your initial custom post type and taxonomy registration code goes in your
functions.php
file.First get your slugs right when defining your custom post types and taxonomies: for the custom post type it should be
basename/%taxonomy_name%
and the slug for your taxonomy should be justbasename
. Don't forget to also add'hierarchical' => true
to the taxonomy rewrite array to get nested terms in your url. Also make surequery_var
is set totrue
in both cases.You need to add a new rewrite rule so WordPress knows how to interpret your url structure. In my case the custom post type part of the uri will always be the 5th uri segment, so I defined my match rule accordingly. Note that you may have to change this if you use more or less uri segments. If you'll have varying levels of nested terms then you'll need to write a function to check whether the the last uri segment is a custom post type or a taxonomy term to know which rule to add (ask me if you need help on that).
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); }
Then you need to add this code to let workpress how to handle
%taxonomy_name%
in your custom post type rewrite slug structure: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);
I created a custom function based on Wordpress's own
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; }
Then you need to flush your permalinks (just load your permalinks settings page).
Now everything 'should' work hopefully! Go make a bunch of taxonomy terms and nest them correctly, then make some custom post type posts and categorize them correctly. You can also make a page with the slug
basename
, and everything should work the way I specified in my question. You may want to create some custom taxonomy archive pages to control how they look and add some kind of taxonomy widget plugin to show your nested categories in the sidebar.Hope that helps you!
-
Behoben - siehe Frage.Jeff,dankefür deine Erklärung!Aber könntees Ihnenmöglich sein,denbenutzerdefinierten Buildfür Posttyp/Taxonomie zu veröffentlichen?So kannich sehen,wasich [falsch]mache (http://wordpress.stackexchange.com/questions/46994/custom-permalinks-post-type-hierarchical-taxonomys)?Wäre wirklich dankbar!Fixed- see question. Jeff, thanks for your explanation! But might it be possible for you to post the custom posttype / taxonomy build? So i can see what i am doing [wrong](http://wordpress.stackexchange.com/questions/46994/custom-permalinks-post-type-hierarchical-taxonomys) ? Would be realy thankfull!
- 0
- 2012-03-28
- Reitze Bos
-
Hey Jeff,dankefür deine Antwort!Ichbin fast da,nach 4 Stunden Kampf damit.Meineinziges Problemist,dassich vor dem Postnameneinen doppelten Schrägstrichbekomme (wiefolgt: Portfolio/diseno-grafico-2/logo//alquimia-sonora/) Können Siemir helfen?Hey Jeff, thanks for your answer! I'm almost there, after 4 hours fighting with this. My only problem is that I get a double slash before the post name (as this: portfolio/diseno-grafico-2/logo//alquimia-sonora/ ) Can you help me?
- 0
- 2012-04-07
- Cmorales
-
@Cmorales,Sie sind sichnicht sicher,ohne Ihren Code zu sehen,suchen abernacheinem Ort,an dem Siemanuelleinen Schrägstrich vor Ihrem Postnamen definieren,z. B. die Registrierung des cpt-Slugs oder die Funktionfilter_post_type?Wenn Sienicht herausfinden können,wo Sie den zusätzlichen Schrägstrich hinzufügen,können Sieeinfach das letzte Zeichen aus dem zurückgegebenen Wert derin filter_post_type_link aufgerufenen Funktionget_taxonomy_parentsentfernen,da Sie danneinen abschließenden Schrägstricherhalten,der derersteistder Doppelgänger.Viel Glück.@Cmorales, Not sure without seeing your code, but look for a place where you manually define a slash before your post name, like maybe the cpt slug registration or in the filter_post_type function? If you can't track down where you're adding the extra slash then you could just strip the last character from the returned value of the get_taxonomy_parents function called in filter_post_type_link, because that will leave you with a trailing slash, which is the first of the double. Good luck.
- 1
- 2012-04-09
- Jeff
-
Ich habe die Permalinks wie Ihren Leitfadenerstellt,aber den Standardlinkin WordPressfür denbenutzerdefinierten Beitragstyp: domain.com/my-post-type/custom-post-type-name (domain.com/place/lotus-hotel) Ichtestenur Ihren Codein derfunction.php. Ich kann den obigen Link (domain.com/place/tokyo/lotus-hotel)nichtmit einerbenutzerdefinierten Taxonomie versehen.Tokioistmeine benutzerdefinierte TaxonomieI created the permalinks like your guide but the default link in wordpress for custom post type: domain.com/my-post-type/custom-post-type-name (domain.com/place/lotus-hotel) I just test your code in the function.php, I can't find the way to add custom taxonomy to above link ( domain.com/place/tokyo/lotus-hotel) - tokyo is my custom taxonomy
-
Vielen,vielen,vielen Dank dafür.Ein kleines Problemistjedoch,dass die Umschreiberegelnmit einer Reihe von%taxonomy_name% -Einträgen oderin meinem Fallmit `apps/%primary_tag%/([^/] +)/page/? ([0-9] {1,})/? $]=> Index.php?% Primary_tag% $ Übereinstimmungen [1] & apps-post=$ Übereinstimmungen [2] &paged=$ Übereinstimmungen [3] `Die Regeln,dieichmanuell hinzufüge,haben Vorrang und scheinen dies zutunder Job,aber diese Einträgeimplizieren,dassetwasnichtganz richtigist.Irgendwelche Ideen?Many many many thanks for this. One minor issue though, it seems to polute the rewrite rules with a bunch of %taxonomy_name% entries or in my case: `apps/%primary_tag%/([^/]+)/page/?([0-9]{1,})/?$] => index.php?%primary_tag%$matches[1]&apps-post=$matches[2]&paged=$matches[3]` The rules I add manually take precedence and seem to do the job, but these entries imply something isn't quite right. Any ideas?
- 0
- 2012-05-16
- Hari Karam Singh
-
"Wenn Sie unterschiedliche Ebenen verschachtelter Begriffe haben,müssen Sieeine Funktion schreiben,um zu überprüfen,ob das letzte Uri-Segmentein benutzerdefinierter Beitragstyp oderein Taxonomiebegriffist,um zu wissen,welche Regel hinzugefügt werdenmuss (fragen Siemich,wenn Sie Hilfebenötigendazu) ... "Nun,können Siemirbitte helfen?:) :)"If you'll have varying levels of nested terms then you'll need to write a function to check whether the the last uri segment is a custom post type or a taxonomy term to know which rule to add (ask me if you need help on that)..." Well, can you help me, please? :)
- 1
- 2013-05-22
- Cmorales
-
^ Genau das habeichgebraucht.weißjemand wieesgeht?Siehemeine Frage hier: http://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rules^ that's exactly what i needed. anybody know how to do it? see my question here: http://wordpress.stackexchange.com/questions/102246/wordpress-returns-404-on-custom-rewrite-rules
- 2
- 2013-06-07
- reikyoushin
-
Das hatgutfunktioniert,aber ausirgendeinem Grund ziehtesnur die Elternkategorie und keines der Kinder.Ich habegenau so kopiert,wie Sieesgepostet haben,undnurmeinen Beitragstyp und die Steuernamengeändert,wo dies angegebenist.Irgendwelche Ideen?This worked good, but for some reason it's only pulling the parent category and none of the children. I copied exactly as you posted and only changed my post type and tax names where indicated. Any ideas?
- 0
- 2014-02-12
- paper_robots
-
Ich weiß,dass diesein wenig altist,aber haben Sie Ideen,wie Sie '/basename' unabhängig von der Taxonomie auf dieneuesten Elementein diesem Beitragstyp verweisen können?I know this is a little old, but do you have any ideas on how to keep '/basename' pointed towards the most recent items in that post type regardless of taxonomy?
- 0
- 2015-02-04
- Daron Spence
-
- 2012-09-17
Sehen Sie sich dieses Plugin an.Esbietet hierarchische URLsfür Kategorien,aber Sie können sichproblemlos anjede Taxonomie anpassen.
Die Regelerstellungfolgteiner rekursiven Funktion .
Take a look at this plugin. It provides hierarchical URLs for categories, but you can easily adapt to any taxonomy.
The rule creation follows a recursive function.
-
Dieses Pluginistnichtmehr verfügbar.This plugin no longer is available.
- 2
- 2018-12-05
- Enkode
-
- 2020-05-03
Für den Umgangmit unterschiedlichen Verschachtelungsebenen
/basename/top-cat/ -> Top Cat Archive /basename/top-cat/post-name/ -> Post in Top Cat /basename/top-cat/child-cat/ -> Child Cat Archive /basename/top-cat/child-cat/post-name/ -> Post in Child Cat
Am Ende habeich Jeffs Lösung ohne den Filter
rewrite_rules_array
verwendet. Stattdessen habeich den Filterrequest
verwendet,um zu überprüfen,ob der letzte URL-Teilein gültiger Postnameist,undihn den query_vars hinzuzufügen.zB
function vk_query_vars($qvars){ if(is_admin()) return $qvars; $custom_taxonomy = 'product_category'; if(array_key_exists($custom_taxonomy, $qvars)){ $custom_post_type = 'product'; $pathParts = explode('/', $qvars[$custom_taxonomy]); $numParts = sizeof($pathParts); $lastPart = array_pop($pathParts); $post = get_page_by_path($lastPart, OBJECT, $custom_post_type); if( $post && !is_wp_error($post) ){ $qvars['p'] = $post->ID; $qvars['post_type'] = $custom_post_type; } } return $qvars; } add_filter('request', 'vk_query_vars');
For dealing with varying level of nesting,
/basename/top-cat/ -> Top Cat Archive /basename/top-cat/post-name/ -> Post in Top Cat /basename/top-cat/child-cat/ -> Child Cat Archive /basename/top-cat/child-cat/post-name/ -> Post in Child Cat
I ended up using Jeff's solution without the
rewrite_rules_array
filter. Instead I used therequest
filter to check if the last url part is a valid postname and add it to the query_vars.eg.
function vk_query_vars($qvars){ if(is_admin()) return $qvars; $custom_taxonomy = 'product_category'; if(array_key_exists($custom_taxonomy, $qvars)){ $custom_post_type = 'product'; $pathParts = explode('/', $qvars[$custom_taxonomy]); $numParts = sizeof($pathParts); $lastPart = array_pop($pathParts); $post = get_page_by_path($lastPart, OBJECT, $custom_post_type); if( $post && !is_wp_error($post) ){ $qvars['p'] = $post->ID; $qvars['post_type'] = $custom_post_type; } } return $qvars; } add_filter('request', 'vk_query_vars');
Ich habe diese Website und Googlenach der Antwort durchsucht undbin völlig leer. Grundsätzlichmöchteichgenau dastun,was dieser Beitrag verlangt,aberichbraucheeine hierarchische Taxonomie. Die Antwortin diesem Beitragfunktioniert hervorragend,abernurmit einereinstufigen Taxonomie. Kannichmachen wasich will? Ich habeeine Million Dinge ausprobiert,aber keinefunktionieren,bestenfalls kannich die richtigen Permalinksbekommen,aber sie kommen auf 404.
Um visuell zu veranschaulichen,wasichmöchte:
Sie können diesgutmit denintegrierten Posts und Kategorientun. Wiemachen Sie dasmit benutzerdefinierten Taxonomien undbenutzerdefinierten Post-Typen? Ich weiß,dass Sie
'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),
,um hierarchische Slugs zuerhalten,was auf den Archivseitengutfunktioniert,aber diebenutzerdefinierte Posts vom Typ "Post" werden angezeigt. 404. Wennich den'hierarchical' => true
Teil dannfunktionieren die Beiträge,aberich verliere die hierarchischen URLs (nur/basename/grandchild-cat/post-name/works).Alsoirgendwelche Lösungen? Vielen Dank,das hatmich seit ungefähr 3 Wochen verrücktgemacht.