web-dev-qa-db-fra.com

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é

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 cet article demande, 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 messages de type message personnalisé remontent à 404. Si je supprime la partie 'hierarchical' => true, 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.

53
Jeff

Après avoir combiné un tas de réponses, j'ai réussi! 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, sont placés dans votre fichier functions.php.

Commencez par définir vos slugs lors de la définition de vos types de messages et de vos taxonomies personnalisés: pour le type de message personnalisé, il doit s'agir de basename/%taxonomy_name% et le slug de votre taxonomie doit être simplement basename. N'oubliez pas d'ajouter également 'hierarchical' => true au tableau de réécriture de la taxonomie pour obtenir des termes imbriqués dans votre URL. Assurez-vous également que query_var est défini sur true dans 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 %taxonomy_name% dans la structure de réécriture de slug de type message personnalisée:

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 le propre get_category_parents de 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;    
}

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 taxonomy widget plugin pour afficher vos catégories imbriquées dans la barre latérale.

J'espère que ça vous aide!

68
Jeff

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

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

2
vmassuchetto