Il se trouve donc que j'avais besoin de quelque chose comme ça pour un projet sur lequel je travaille. J'ai simplement écrit une requête pour sélectionner tous les messages d'un type personnalisé, puis je vérifie quels sont les termes réels de ma taxonomie qu'ils utilisent.
Ensuite, j'ai obtenu tous les termes de cette taxonomie en utilisant get_terms()
, puis j'ai utilisé uniquement ceux qui figuraient dans les deux listes, je l'ai enveloppé dans une fonction et j'ai terminé.
Mais ensuite, j'avais besoin de plus que des ID: j'avais besoin des noms, j'ai donc ajouté un nouvel argument nommé $fields
pour pouvoir dire à la fonction quoi renvoyer. Ensuite, je me suis dit que cela get_terms
acceptait de nombreux arguments et ma fonction se limitait à des termes utilisés par un type de message, j'ai donc ajouté une autre if
déclaration et c'est parti:
La fonction:
/* get terms limited to post type
@ $taxonomies - (string|array) (required) The taxonomies to retrieve terms from.
@ $args - (string|array) all Possible Arguments of get_terms http://codex.wordpress.org/Function_Reference/get_terms
@ $post_type - (string|array) of post types to limit the terms to
@ $fields - (string) What to return (default all) accepts ID,name,all,get_terms.
if you want to use get_terms arguments then $fields must be set to 'get_terms'
*/
function get_terms_by_post_type($taxonomies,$args,$post_type,$fields = 'all'){
$args = array(
'post_type' => (array)$post_type,
'posts_per_page' => -1
);
$the_query = new WP_Query( $args );
$terms = array();
while ($the_query->have_posts()){
$the_query->the_post();
$curent_terms = wp_get_object_terms( $post->ID, $taxonomy);
foreach ($curent_terms as $t){
//avoid duplicates
if (!in_array($t,$terms)){
$terms[] = $c;
}
}
}
wp_reset_query();
//return array of term objects
if ($fields == "all")
return $terms;
//return array of term ID's
if ($fields == "ID"){
foreach ($terms as $t){
$re[] = $t->term_id;
}
return $re;
}
//return array of term names
if ($fields == "name"){
foreach ($terms as $t){
$re[] = $t->name;
}
return $re;
}
// get terms with get_terms arguments
if ($fields == "get_terms"){
$terms2 = get_terms( $taxonomies, $args );
foreach ($terms as $t){
if (in_array($t,$terms2)){
$re[] = $t;
}
}
return $re;
}
}
Usage:
Si vous n'avez besoin que d'une liste d'ID de termes, alors:
$terms = get_terms_by_post_type('tag','','snippet','ID');
Si vous avez seulement besoin d'une liste de noms de termes, alors:
$terms = get_terms_by_post_type('tag','','snippet','name');
Si vous n'avez besoin que d'une liste d'objets de termes, alors:
$terms = get_terms_by_post_type('tag','','snippet');
Et si vous avez besoin d'utiliser des arguments supplémentaires de get_terms comme: orderby, order, hierarchical ...
$args = array('orderby' => 'count', 'order' => 'DESC', 'hide_empty' => 1);
$terms = get_terms_by_post_type('tag',$args,'snippet','get_terms');
Prendre plaisir!
Mise à jour:
Pour fixer le nombre de termes à une modification de type de publication spécifique:
foreach ($current_terms as $t){
//avoid duplicates
if (!in_array($t,$terms)){
$terms[] = $t;
}
}
à:
foreach ($current_terms as $t){
//avoid duplicates
if (!in_array($t,$terms)){
$t->count = 1;
$terms[] = $t;
}else{
$key = array_search($t, $terms);
$terms[$key]->count = $terms[$key]->count + 1;
}
}