Come creare una struttura di permalink con tassonomie personalizzate e tipi di post personalizzati come base-name / parent-tax / child-tax / custom-post-type-name
3 risposta
- voti
-
- 2012-01-23
Dopo aver combinato un sacco di altre risposte,hofunzionato! Quindiecco la soluzioneper quelli di voi che stanno lottando anche con questo:
Questopost e questo mi ha aiutato a risolverlo,quindigrazie a quei ragazzi.
Nota,tutto questo codice,piùiltipo di articolopersonalizzatoinizialee il codice di registrazione dellatassonomia vannoneltuofile
functions.php
.Perprima cosa,imposta correttamentei tuoi slug quando definiscii tuoitipi dipostpersonalizzatie tassonomie:periltipo dipostpersonalizzato dovrebbeessere
basename/%taxonomy_name%
e lo slugper latuatassonomia dovrebbeessere solobasename
. Non dimenticare di aggiungere anche'hierarchical' => true
all'array di riscrittura dellatassonomiaper otteneretermininidificatinell'URL. Assicuratiinoltre chequery_var
siaimpostato sutrue
in entrambii casi.Devi aggiungere unanuova regola di riscritturain modo che WordPress sappia comeinterpretare la struttura dell'URL. Nelmio caso laparte deltipo dipostpersonalizzato dell'uri sarà sempreil quinto segmento dell'uri,quindi ho definito lamia regola di corrispondenza di conseguenza. Nota chepotresti dovermodificare questaimpostazione se usipiù omeno segmenti uri. Se avrai diversi livelli ditermini annidati,dovrai scrivere unafunzioneper verificare se l'ultimo segmento di uri è untipo dipostpersonalizzato o untermine ditassonomiaper sapere quale regola aggiungere (chiedimi se haibisogno di aiuto su quello).
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); }
Quindi ènecessario aggiungere questo codiceper consentire a workpress di comegestire
%taxonomy_name%
nella struttura dello slug di riscrittura deltipo di articolopersonalizzato: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);
Ho creato unafunzionepersonalizzatabasata su
get_category_parents
di Wordpress:// 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; }
Quindi devi svuotarei tuoipermalink (basta caricare lapagina delleimpostazioni deipermalink).
Oratutto "dovrebbe"funzionare,si spera! Crea una serie ditermini ditassonomiae annidali correttamente,quindi crea alcunipostpersonalizzatie classificali correttamente. Puoi anche creare unapagina con lo slug
basename
e tutto dovrebbefunzionare come ho specificatonellamia domanda. Potresti voler creare alcunepagine di archivio ditassonomiapersonalizzateper controllarne l'aspettoe aggiungere una sorta di widget ditassonomia permostrare letue categorienidificatenellabarra laterale.Spero che questoti aiuti!
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!
-
Risolto - vedi domanda.Jeff,grazieper latua spiegazione!Mapotrebbeesserepossibilepubblicare labuild diposttype/tassonomiapersonalizzata?Quindiposso vedere cosa stofacendo [sbagliato] (http://wordpress.stackexchange.com/questions/46994/custom-permalinks-post-type-hierarchical-taxonomys)?Sarei davverograto!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
-
Ehi Jeff,grazieper latua risposta!Sono quasi arrivato,dopo 4 ore di combattimento con questo.Ilmio unicoproblema è che ottengo una doppiabarraprima delnome delpost (come questo:portfolio/diseno-grafico-2/logo//alquimia-sonora/) Potete aiutarmi?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,Non sono sicuro senza vedereiltuo codice,ma cerchi unpostoin cui definiremanualmente unabarraprima delnome deltuopost,comeforse la registrazione dello slug cpt onellafunzionefilter_post_type?Senon riesci a rintracciare dove stai aggiungendo labarrain più,potresti semplicemente rimuovere l'ultimo carattere dal valore restituito dallafunzioneget_taxonomy_parents chiamatain filter_post_type_link,perché questoti lascerà con unabarrafinale,che è laprima diIl doppio.Inbocca al lupo.@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
-
Ho creatoi permalink come latuaguidamail linkpredefinitoin wordpressperiltipo dipostpersonalizzato: domain.com/my-post-type/custom-post-type-name (domain.com/place/lotus-hotel) Ho appenatestatoiltuo codicein function.php,non riesco atrovareilmodoper aggiungere unatassonomiapersonalizzata al link sopra (domain.com/place/tokyo/lotus-hotel) -tokyo è lamiatassonomiapersonalizzataI 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
-
Moltemoltemoltegrazieper questo.Unproblemaminore,però,sembrainquinare le regole di riscrittura con unmucchio di voci%taxonomy_name% onelmio caso: `apps/%primary_tag%/([^/] +)/page/? ([0-9] {1,})/? $]=> Index.php?% Primary_tag% $ corrisponde a [1] & apps-post=$ corrisponde a [2] &paged=$ corrisponde a [3] `Le regole che aggiungomanualmente hanno laprecedenzae sembranoil lavoro,ma queste vociimplicano che qualcosanon vabene.Qualcheidea?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
-
"Se hai diversi livelli ditermininidificati,dovrai scrivere unafunzioneper verificare se l'ultimo segmento di uri è untipo dipostpersonalizzato o untermine ditassonomiaper sapere quale regola aggiungere (chiedimi se haibisogno di aiutosu quello) ... "Beh,puoi aiutarmi,perfavore?:)"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
-
^ èesattamente quello di cui avevobisogno.qualcuno sa comefarlo?vedere lamia domanda qui: 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
-
Hafunzionatobene,maper qualchemotivo sta solotirando la categoria deigenitorie nessuno deibambini.Ho copiatoesattamente come haipubblicatoe ho cambiato soloiltipo di articoloe inomifiscali doveindicato.Qualcheidea?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
-
So che questo è unpo 'vecchio,ma hai qualcheidea su comemantenere'/basename 'puntato versoglielementipiù recentiin queltipo dipostindipendentemente dallatassonomia?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
Dai un'occhiata a questoplugin .Fornisce URLgerarchiciper le categorie,mapuoi adattartifacilmente a qualsiasitassonomia.
La creazione della regola segue una funzione ricorsiva .
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.
-
Questopluginnon èpiù disponibile.This plugin no longer is available.
- 2
- 2018-12-05
- Enkode
-
- 2020-05-03
Pergestire diversi livelli dinidificazione,
/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
Hofinitoper utilizzare la soluzione di Jeff senzailfiltro
rewrite_rules_array
. Invece ho usatoilfiltrorequest
per verificare se l'ultimaparte dell'URL è unpostname validoe aggiungerlo a query_vars.ades.
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');
Ho setacciato questo sitoe Googlepertrovare la rispostae sono uscito completamente vuoto. Fondamentalmente vogliofareesattamente quello che questopost chiede,ma hobisogno unatassonomiagerarchica. La rispostafornitain quelpostfunziona allagrande,ma solo con unatassonomia a livello singolo. Èpossibilefare quello che voglio? Hoprovato unmilione di cose,manessunafunziona,nellamigliore delleipotesi riesco a ottenerei permalinkgiustima sono 404.
Perillustrare visivamente ciò che voglio:
Puoifarlobene coni poste le categorieincorporati,comepuoifarlo contassonomiepersonalizzatee tipi dipostpersonalizzati? So che devi utilizzare
'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),
per ottenere sluggerarchici,chefunzionabene sullepagine di archivio,mail vengono visualizzatii post ditipo dipostpersonalizzato 404. Se rimuovo'hierarchical' => true
quindii postfunzionano,maperdogli URLgerarchici (solo/basename/grandchild-cat/post-name/works).Quindi,qualche soluzione? Graziemille,questomi faimpazzire da circa 3 settimane.