Dopo aver combinato un mucchio di altre risposte, l'ho fatto funzionare! Quindi, ecco la soluzione per quelli di voi che hanno difficoltà anche con questo:
Questo post e questo mi hanno aiutato un po ', quindi grazie a quei ragazzi.
Si noti che tutto questo codice, oltre al tipo di posta personalizzato iniziale e al codice di registrazione della tassonomia, vengono inseriti nel functions.php
file.
Per prima cosa prendi le tue lumache giuste quando definisci i tuoi tipi di post personalizzati e le tassonomie: per il tipo di post personalizzato dovrebbe essere basename/%taxonomy_name%
e lo slug per la tua tassonomia dovrebbe essere giusto basename
. Non dimenticare di aggiungere anche 'hierarchical' => true
l'array di riscrittura della tassonomia per ottenere termini nidificati nell'URL. Assicurarsi inoltre che query_var
sia impostato su true
in entrambi i casi.
Devi aggiungere una nuova regola di riscrittura in modo che WordPress sappia come interpretare la tua struttura URL. Nel mio caso la parte del tipo di post personalizzato dell'uri sarà sempre il quinto segmento uri, quindi ho definito la mia regola di corrispondenza di conseguenza. Nota che potresti doverlo cambiare se usi più o meno segmenti uri. Se hai diversi livelli di termini nidificati, dovrai scrivere una funzione per verificare se l'ultimo segmento uri è un tipo di post personalizzato o un termine di tassonomia per sapere quale regola aggiungere (chiedimi se hai bisogno 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 codice per consentire a workpress come gestire %taxonomy_name%
il tipo di post personalizzato riscrivere la struttura delle lumache:
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 una funzione personalizzata basata su Wordpress 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;
}
Quindi è necessario svuotare i permalink (basta caricare la pagina delle impostazioni dei permalink).
Ora tutto "dovrebbe" funzionare, si spera! Vai a creare un mucchio di termini di tassonomia e annidali correttamente, quindi crea alcuni post di tipo di post personalizzati e classificali correttamente. Puoi anche creare una pagina con la lumaca basename
e tutto dovrebbe funzionare come ho specificato nella mia domanda. Potresti voler creare alcune pagine di archivio di tassonomia personalizzate per controllarne l'aspetto e aggiungere una sorta di plug-in per widget di tassonomia per mostrare le categorie nidificate nella barra laterale.
Spero che ti aiuti!