Comment créer une structure de lien permanent avec des taxonomies et des types d'article personnalisés, tels que nom de base / taxe-parent / taxe-enfant / nom-type-post-personnalisé

53

Je suis passé au peigne fin sur ce site et sur Google pour trouver la réponse et je suis arrivé complètement vide. En gros, je veux faire exactement ce que demande ce message , mais il me faut une taxonomie hiérarchique. La réponse donnée dans cet article fonctionne très bien, mais seulement avec une taxonomie à un seul niveau. Est-il possible de faire ce que je veux? J'ai essayé un million de choses, mais aucune ne fonctionne, au mieux, je peux obtenir les bons permaliens, mais ils arrivent 404.

Illustrer visuellement ce que je veux:

/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

Vous pouvez le faire très bien avec les publications et les catégories intégrées. Comment procédez-vous avec les taxonomies personnalisées et les types de publication personnalisés? Je sais que vous devez utiliser 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),pour obtenir des slugs hiérarchiques, ce qui fonctionne bien sur les pages d'archive, mais les posts de type de message personnalisé remontent à 404. Si je supprime la 'hierarchical' => truepartie, les messages fonctionnent, mais je perds les URL hiérarchiques (uniquement / basename / petitchild-cat / post-name / works).

Alors, des solutions? Merci beaucoup, cela me rend fou depuis environ 3 semaines maintenant.

Jeff
la source

Réponses:

68

Après avoir combiné un tas de réponses, je l'ai fait fonctionner! Alors, voici la solution pour ceux d'entre vous qui luttent avec cela aussi:

Ce post et celui-ci m'a aidé, alors merci à ces gars-là.

Notez que tout ce code, ainsi que votre type d’enregistrement personnalisé initial et votre code d’enregistrement de taxonomie, vont dans votre functions.phpfichier.

Commencez par définir correctement vos slugs lors de la définition de vos types de messages et de vos taxonomies: pour le type de message personnalisé, ce devrait être le cas basename/%taxonomy_name%et le slug pour votre taxonomie devrait être juste basename. N'oubliez pas d'ajouter également 'hierarchical' => trueà la taxonomie le tableau de réécriture pour obtenir les termes imbriqués dans votre URL. Assurez query_var- vous également qu'il est réglé sur truedans les deux cas.

Vous devez ajouter une nouvelle règle de réécriture pour que WordPress sache interpréter votre structure d'URL. Dans mon cas, la partie type de publication personnalisée de l'URI sera toujours le 5ème segment d'URI, j'ai donc défini ma règle de correspondance en conséquence. Notez que vous devrez peut-être changer cela si vous utilisez plus ou moins de segments uri. Si vous avez différents niveaux de termes imbriqués, vous devez écrire une fonction pour vérifier si le dernier segment d'URI est un type de publication personnalisé ou un terme de taxonomie pour savoir quelle règle ajouter (demandez-moi si vous avez besoin d'aide cette).

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);
}

Ensuite, vous devez ajouter ce code pour permettre à Workpress de savoir comment gérer la %taxonomy_name%structure de réécriture de slug de type de message personnalisé:

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);

J'ai créé une fonction personnalisée basée sur celle de 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;    
}

Ensuite, vous devez vider vos permaliens (chargez simplement votre page de paramètres de permaliens).

Maintenant, tout devrait fonctionner, espérons-le! Créez un ensemble de termes de taxonomie et imbriquez-les correctement, puis créez des publications de type publication personnalisées et catégorisez-les correctement. Vous pouvez également créer une page avec le slug basename, et tout devrait fonctionner comme je l’ai spécifié dans ma question. Vous souhaiterez peut-être créer des pages d'archives de taxonomie personnalisées pour contrôler leur apparence et ajouter une sorte de plug-in de widget de taxonomie pour afficher vos catégories imbriquées dans la barre latérale.

J'espère que ça vous aide!

Jeff
la source
Fixe - voir question. Jeff, merci pour votre explication! Mais pourrait-il être possible pour vous de poster la construction personnalisée posttype / taxonomy? Donc je peux voir ce que je fais mal ? Serait vraiment merci!
Reitze Bos
Hey Jeff, merci pour votre réponse! Je suis presque là, après 4 heures de combat avec ça. Mon seul problème est que je reçois une double barre oblique avant le nom du message (comme ceci: portfolio / diseno-grafico-2 / logo // alquimia-sonora /) Pouvez-vous m'aider?
Cmorales
1
@Cmorales, Pas sûr sans voir votre code, mais cherchez un endroit où vous définissez manuellement une barre oblique avant votre nom de poste, comme peut-être l'enregistrement de slug cpt ou la fonction filter_post_type? Si vous ne pouvez pas savoir où vous ajoutez la barre oblique supplémentaire, vous pouvez simplement supprimer le dernier caractère de la valeur renvoyée par la fonction get_taxonomy_parents appelée dans filter_post_type_link, car cela vous laissera une dernière barre oblique, qui est la première des le double. Bonne chance.
Jeff
1
"Si vous avez différents niveaux de termes imbriqués, vous devez écrire une fonction pour vérifier si le dernier segment d'URI est un type de publication personnalisé ou un terme de taxonomie pour savoir quelle règle ajouter (demandez-moi si vous avez besoin d'aide sur cela) ... "Bien, pouvez-vous m'aider, s'il vous plaît? :)
Cmorales
2
^ c'est exactement ce dont j'avais besoin. Quelqu'un sait comment le faire? Voir ma question ici: wordpress.stackexchange.com/questions/102246/…
reikyoushin
2

Jetez un coup d'oeil à ce plugin . Il fournit des URL hiérarchiques pour les catégories, mais vous pouvez facilement vous adapter à toute taxonomie.

La création de règle suit une fonction récursive .

vmassuchetto
la source
2
Ce plugin n'est plus disponible.
Enkode