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.php
fichier.
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 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 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!