Come creare una struttura permalink con tassonomie personalizzate e tipi di posta personalizzati come nome-base / imposta-genitore / imposta-figlio / nome-tipo-di-posta personalizzato


53

Sto pettinando questo sito e Google per la risposta e sono arrivato completamente vuoto. Fondamentalmente voglio fare esattamente ciò che questo post chiede, ma ho bisogno di una tassonomia gerarchica. La risposta fornita in quel post funziona alla grande, ma solo con una tassonomia a livello singolo. È possibile fare quello che voglio? Ho provato un milione di cose, ma nessuna funziona, nella migliore delle ipotesi posso ottenere i permalink giusti, ma escono 404.

Per illustrare visivamente ciò che voglio:

/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

Puoi farlo bene con i post e le categorie integrati, come puoi farlo con tassonomie personalizzate e tipi di post personalizzati? So che è necessario utilizzare 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),per ottenere lumache gerarchiche, che funzionano bene nelle pagine di archivio, ma i post di tipo di post personalizzati arrivano a 404. Se rimuovo la 'hierarchical' => trueparte, i post funzionano, ma perdo gli URL gerarchici (solo / nome base / grandchild-cat / post-name / works).

Quindi, qualche soluzione? Grazie mille, questo mi sta facendo impazzire da circa 3 settimane.

Risposte:


68

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.phpfile.

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' => truel'array di riscrittura della tassonomia per ottenere termini nidificati nell'URL. Assicurarsi inoltre che query_varsia impostato su truein 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 basenamee 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!


Risolto - vedi domanda. Jeff, grazie per la tua spiegazione! Ma potrebbe essere possibile pubblicare la build posttype / taxonomy personalizzata? Quindi posso vedere cosa sto facendo di sbagliato ? Sarebbe davvero grato!
Reitze Bos,

Ehi Jeff, grazie per la tua risposta! Sono quasi arrivato, dopo 4 ore a combattere con questo. Il mio unico problema è che ottengo una doppia barra prima del nome del post (come questo: portfolio / diseno-grafico-2 / logo // alquimia-sonora /) Mi potete aiutare?
Cmorales,

1
@Cmorales, Non sei sicuro di non vedere il tuo codice, ma cerchi un posto in cui definire manualmente una barra prima del nome del tuo post, come forse la registrazione di slug cpt o nella funzione filter_post_type? Se non riesci a rintracciare dove stai aggiungendo la barra aggiuntiva, puoi semplicemente eliminare l'ultimo carattere dal valore restituito della funzione get_taxonomy_parents chiamata in filter_post_type_link, perché ciò ti lascerà con una barra finale, che è la prima di Il doppio. In bocca al lupo.
Jeff,

1
"Se avrai 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 questo) ... "Beh, puoi aiutarmi, per favore? :)
Cmorales,

2
^ è esattamente quello di cui avevo bisogno. qualcuno sa come farlo? vedi la mia domanda qui: wordpress.stackexchange.com/questions/102246/…
reikyoushin

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.