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

52

J'ai consulté ce site et Google pour trouver la réponse et je suis arrivé complètement vide. En gros, je veux faire exactement ce que cette publication demande, mais il me faut une taxonomie hiérarchique. La réponse donnée dans cet article fonctionne très bien, mais uniquement 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.

Pour 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 publication personnalisée remontent à 404. Si je supprime la partie 'hierarchical' => true , les messages fonctionnent, mais je perds le contenu. URL hiérarchiques (uniquement / basename / petitchild-cat / post-name / works).

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

    
posée Jeff 20.01.2012 - 01:37
la source

2 réponses

64

Après avoir combiné un tas d’autres réponses, je l’ai fait fonctionner! Alors, voici la solution pour ceux qui se débattent avec cela aussi:

Ce message et ceci m'a aidé à en sortir, merci donc à Ces gars.

Notez que tout ce code, ainsi que votre code d'enregistrement de type d'article personnalisé initial et de taxonomie, sont placés dans votre fichier functions.php .

Commencez par définir correctement vos slugs lors de la définition de vos types de publication et de vos taxonomies: pour le type de publication personnalisé, il doit correspondre à basename/%taxonomy_name% et le slug de votre taxonomie doit être uniquement 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. ça).

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é:

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 la page des paramètres de vos permaliens).

Maintenant, tout "devrait" fonctionner avec espoir! 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 pouvez créer des pages d’archive de taxonomie personnalisées pour contrôler leur apparence et ajouter un plugin widget de taxonomie . pour afficher vos catégories imbriquées dans la barre latérale.

J'espère que cela vous aide!

    
réponse donnée Jeff 23.01.2012 - 19:31
la source
2

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

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

    
réponse donnée vmassuchetto 17.09.2012 - 18:02
la source

Lire d'autres questions sur les étiquettes