Après avoir suivi la suggestion de Jeff sur , ce fil crée des termes de taxonomie imbriqués pour les parents et les enfants au sein d'un lien permanent, comme ...
url.com/custom-post-type/taxonomy-parent/taxonomy-child/cpt-entry
Cela fonctionne principalement sauf pour un problème.
Avant de continuer, je dois mentionner que j'ai un type de publication personnalisé appelé gallery et une taxonomie appelée gallery_cat .
TRAVAIL
/gallery/ - archive-gallery.php
/gallery/wedding-cakes/ - parent taxonomy - taxonomy-gallery_cat.php
/gallery/wedding-cakes/chocolate/ - child taxonomy - taxonomy-gallery_cat.php
/gallery/wedding-cakes/chocolate/cpt-entry/ - CPT entry under child taxonomy - single-gallery.php
Ne fonctionne pas
/gallery/wedding-cakes/cpt-entry/ - CPT entry under parent taxonomy
Voici mon code dans functions.php:
// ADD A GALLERY CUSTOM POST TYPE WITH GALLERY_CAT TAXONOMY
add_action('init', 'create_gallery_post_type');
function create_gallery_post_type() {
register_taxonomy(
'gallery_cat',
'gallery',
array(
'label' => 'Categories',
'singular_label' => 'Category',
'hierarchical' => true,
'query_var' => true,
'rewrite' => array('slug' => 'gallery', 'hierarchical' => true ),
)
);
$labels = array(
'name' => _x('Gallery', 'post type general name'),
'singular_name' => _x('Photo', 'post type singular name'),
'add_new' => _x('Add New', 'gallery'),
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'query_var' => true,
'capability_type' => 'post',
'hierarchical' => false,
'menu_position' => null,
'supports' => array('title','editor','thumbnail', 'excerpt', 'author', 'comments'),
'rewrite' => array(
'slug' => 'gallery/%gallery_cat%',
'with_front' => false
),
'has_archive' => 'gallery',
'menu_icon' => get_bloginfo('template_directory') . '/images/gallery-icon.png' //16x16 png if you want an icon
);
register_post_type( 'gallery' , $args );
}
function filter_post_type_link($link, $post) {
if ($post->post_type != 'gallery')
return $link;
if ($cats = get_the_terms($post->ID, 'gallery_cat')) {
$link = str_replace('%gallery_cat%', rtrim(get_taxonomy_parents(array_pop($cats)->term_id, 'gallery_cat', false, '/', true),"/"), $link); // see custom function defined below
}
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);
// 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;
}
//Rewrite rules
add_filter('rewrite_rules_array', 'gallery_rewrite_rules');
function gallery_rewrite_rules($rules) {
$newRules = array();
$newRules['gallery/(.+)/(.+)/(.+)/?$'] = 'index.php?gallery=$matches[3]';
$newRules['gallery/(.+)/(.+)/?$'] = 'index.php?gallery_cat=$matches[2]';
$newRules['gallery/(.+)/?$'] = 'index.php?gallery_cat=$matches[1]';
return array_merge($newRules, $rules);
}
Maintenant, je pense que le problème est où je dois ajouter la ligne suivante au tableau de règles de réécriture:
$newRules['gallery/(.+)/(.+)/?$'] = 'index.php?gallery=$matches[2]';
parce que ma structure personnalisée n'aura pas toujours le nom de poste en tant que 3ème segment d'URI, car si le CPT est uniquement sous une taxonomie parent, il sera dans le 2ème segment d'URI.
Mais quand j'ajoute ça, ça casse les choses. Ma meilleure hypothèse est que cela se heurte à cette ligne ...
$newRules['gallery/(.+)/(.+)/?$'] = 'index.php?gallery_cat=$matches[2]';
Jeff, qui m'a aidé à me rendre si loin de ce fil , a dit ce qui suit ...
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.
Quelqu'un sait comment cela peut être accompli?
Merci
Pour voir comment nous pouvons faire en sorte que cela fonctionne, parcourez la page Codex de présentation de la requête , en particulier le type que les plugins peuvent modifier. section:
Modifiez la spécification de la requête après avoir enregistré les valeurs de variable (filtre
request
ou actionparse_request
; si vous souhaitez utiliser des tests de balises conditionnelles, utilisez l'actionparse_query
oupre_get_posts
, car celles-ci s'exécutent après la définition des variablesis_
).
Dans ce cas, nous voulons filtrer request
, qui sera un tableau des vars de requête définis par la méthode parse_request
DE LA CLASSE WP
(scroll à la fin de cette fonction pour voir où le filtre est appliqué).
Dans notre filtre, nous vérifierons si gallery_cat
est défini et si le terme demandé est en réalité un terme gallery_cat
existant. Si ce n'est pas le cas, nous supposerons qu'il s'agit d'une publication gallery
et réinitialisons les vars de requête pour créer une requête WordPress pour la publication au lieu du terme. Pour ce faire, nous devons définir 3 requêtes de requête différentes: gallery
, name
et post_type
.
function wpd_gallery_request_filter( $request ){
if( array_key_exists( 'gallery_cat' , $request )
&& ! get_term_by( 'slug', $request['gallery_cat'], 'gallery_cat' ) ){
$request['gallery'] = $request['gallery_cat'];
$request['name'] = $request['gallery_cat'];
$request['post_type'] = 'gallery';
unset( $request['gallery_cat'] );
}
return $request;
}
add_filter( 'request', 'wpd_gallery_request_filter' );