J'ai un type de message personnalisé - cas - pour lequel je construis une page d'archive. Il existe trois taxonomies personnalisées pour ce type - micro_organismes _, types_infection et types_antibiotiques. Ces taxonomies sont hiérarchiques et ont une variété de termes allant jusqu'à trois niveaux. Pour le type de message donné, je souhaite lister les termes, par exemple pour la taxonomie antibiotic_types, utilisés par toutes les entrées cas.
Bien qu'un terme de la taxonomie antibiotic_types puisse être utilisé par l'une des entrées cas, je souhaite afficher la hiérarchie menant au terme sélectionné.
Jusqu’à présent, j’ai eu les résultats suivants, ce qui donne une liste simple des termes sélectionnés, ne reflétant pas la hiérarchie dans laquelle ils se trouvent.
// sourced from:
// http://wordpress.stackexchange.com/questions/66015/how-to-get-a-list-of-taxonomy-terms-which-are-being-used-only-within-certain-pos
function get_terms_by_post_type( $taxonomies, $post_types ) {
global $wpdb;
$query = $wpdb->get_results( "SELECT t.*, COUNT(*) AS count from $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id WHERE p.post_type IN('" . join( "', '", $post_types ) . "') AND tt.taxonomy IN('" . join( "', '", $taxonomies ) . "') GROUP BY t.term_id");
return $query;
}
?>
...
<ul class="taxonomy-term-list">
<?php
$terms = get_terms_by_post_type(array($tax), array('case'));
foreach ($terms as $term):
$termData = get_term_by('id', $term->term_id, $tax);
$termName = $termData->name;
$termUrl = get_term_link($termData);
?>
<li class="taxonomy-term"><a href="<?php echo $termUrl; ?>?post_type=<?php echo $type; ?>"><?php echo $termName; ?> (<?php echo $term->count; ?>)</a></li>
<?php
endforeach;
?>
</ul>
La sortie ressemble à:
Alors que la sortie souhaitée est:
J'ai également essayé d'utiliser les éléments suivants:
wp_list_categories(
array(
'taxonomy' => 'antibiotic_types',
'hierarchical' => 1,
'hide_empty' => 1,
'title_li' => ''
)
);
Ce qui montre all des termes de la taxonomie donnée, même ceux qui ne sont utilisés par aucune entrée case.
Après avoir parcouru la référence de la fonction, il ne semble pas y avoir de fonction intégrée permettant de faire ce que je veux réaliser, pas directement de toute façon. Je n'ai pas fait grand chose avec les questions de taxonomie jusqu'à maintenant. Aucune suggestion?
Si vous voyez la documentation pour wp_list_categories
dans le codex, vous constaterez qu'elle accepte un paramètre include
, qui devrait contenir une liste d'id de catégories séparées par des virgules.
Donc, si vous modifiez votre fonction get_terms_by_post_type
en créant la fonction get_terms_id_by_post_type
pour récupérer uniquement les identifiants de termes, comme ceci:
function get_terms_id_by_post_type( $taxonomies, $post_types ) {
global $wpdb;
$query = $wpdb->get_col( "SELECT t.term_id from $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id INNER JOIN $wpdb->posts AS p ON p.ID = r.object_id WHERE p.post_type IN('" . join( "', '", $post_types ) . "') AND tt.taxonomy IN('" . join( "', '", $taxonomies ) . "') GROUP BY t.term_id");
return $query;
}
Ensuite vous pouvez:
// retrieve the term ids used by post type
$terms = get_terms_id_by_post_type( array($tax), array('case') );
// if that terms exist implode in a commasepared string
$term_list = ! empty($terms) ? implode(',', $terms) : false;
// use wp_list_categories with include param to included only used terms
if ( $term_list ) {
wp_list_categories(
array(
'taxonomy' => 'antibiotic_types',
'hierarchical' => 1,
'hide_empty' => 1,
'title_li' => '',
'include' => $term_list
)
);
}
Juste au cas où quelqu'un cherchant sur Google aurait seulement besoin d'afficher les termes d'une taxonomie utilisée par les publications du CPT vers une autre taxonomie, voici le code que j'ai utilisé pour cela, basé sur la réponse de @gmazzap:
// Get all story post IDs set to story_type of "rn"
$story_post_ids = get_posts([
'numberposts' => -1,
'fields' => 'ids',
'post_type' => 'story',
'tax_query' => [
[
'taxonomy' => 'story_type',
'field' => 'slug',
'terms' => ['rn'],
'compare' => 'IN',
]
],
]);
// Find story topics in use by those post IDs
$story_topic_ids = $wpdb->get_col("
SELECT t.term_id FROM $wpdb->terms AS t
INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id
INNER JOIN $wpdb->term_relationships AS r ON r.term_taxonomy_id = tt.term_taxonomy_id
WHERE tt.taxonomy IN('story_topic')
AND r.object_id IN (".implode(',', $story_post_ids).")
GROUP BY t.term_id
");
// Pull those topics
$story_topics = get_terms([
'taxonomy' => 'story_topic',
'include' => $story_topic_ids,
]);
Cela permet de trouver tous les termes de type story_topic
utilisés par les publications définies avec le terme story_type
de "rn".