J'ai deux types de messages personnalisés «pays» et «ville» et une taxonomie partagée «drapeau».
Si j'utilise:
<?php $flags = get_terms('flag', 'orderby=name&hide_empty=0');
Je reçois une liste de tous les termes de la taxonomie, mais je veux limiter la liste au type de message «pays».
Comment puis-je le faire?
Utiliser la nouvelle solution
<?php
$flags = wpse57444_get_terms('flags',array('parent' => 0,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($flags as $flag) {
$childTerms = wpse57444_get_terms('flags',array('parent' => $flag->term_id,'hide_empty' => 1,'post_types' =>array('country')));
foreach ($childTerms as $childTerm) {
echo $childTerm->name.'<br />';
}
}
?>
Je ne peux pas faire écho à $ childTerm-> name. Pourquoi?
custom-post-types
taxonomy
terms
user1443216
la source
la source
Réponses:
J'ai bien peur que ce ne soit pas possible nativement (encore?). Voir ce trac: http://core.trac.wordpress.org/ticket/18106
De même, sur la page d'administration de la taxonomie, le nombre de publications reflète tous les types de publication. (
Je suis quasiment sûr qu'il y a aussi un ticket Trac pour cela) http://core.trac.wordpress.org/ticket/14084Voir aussi, ce poste connexe .
Nouvelle solution
Après avoir écrit celui ci-dessous, j'ai publié une bien meilleure façon (tout en ce sens que vous pouvez en faire plus) est d'utiliser les filtres fournis dans l'
get_terms()
appel. Vous pouvez créer une fonction wrapper qui utiliseget_terms
et (conditionnellement) ajoute un filtre pour manipuler la requête SQL (à restreindre par type de publication).La fonction prend les mêmes arguments que
get_terms($taxonomies, $args)
.$args
prend l'argument supplémentairepost_types
qui prend un tableau | chaîne de types de messages.Mais je ne peux pas garantir que tout fonctionne "comme prévu" (je pense rembourrer le décompte). Cela semble fonctionner en utilisant uniquement le par défaut
$args
forget_terms
.Usage
Contournement original
Inspiré du ticket Trac ci-dessus, (testé et cela fonctionne pour moi)
Usage
ou
la source
$args = array('parent'=>0,'orderby'=>'name','hide_empty'=>0);
. Je vais modifier cela pour autoriser les chaînes de requête ...$terms = wpse57444_filter_terms_by_cpt('flag',array('country','city'));
:?wpse57444_get_terms()
$args
est le deuxième argument. Là, vous venez de mettrewpse57444_get_terms( 'flag', array( 'country', 'city' ) );
La réponse de @ stephen-harris ci-dessus n'a fonctionné que partiellement pour moi. Si j'ai essayé de l'utiliser deux fois sur la page, cela n'a pas fonctionné. De plus, l'idée d'enterrer les requêtes mysql comme ça m'inquiète - je pense que sa meilleure pratique consiste à utiliser des méthodes de base pour parvenir à une solution, afin d'éviter les conflits avec les futures mises à jour de WP. Voici ma solution, basée sur un commentaire # 7 sur le ticket Trac qu'il référence
Usage:
Cela ne fonctionne que pour un seul type de publication et une seule taxonomie, car c'est ce dont j'avais besoin, mais il ne serait pas trop difficile de le modifier pour accepter plusieurs valeurs.
Il y avait une mention sur ce fil Trac que cela peut ne pas bien évoluer, mais je travaille sur une assez petite échelle et je n'ai eu aucun problème de vitesse.
la source
Deux types de messages personnalisés «pays» et «ville» et une taxonomie partagée «drapeau». Vous souhaitez limiter la liste au type de publication «pays».
Voici une solution plus simple:
la source
[modifier] Ceci est un commentaire sur l'excellente réponse de Stephen Harris.
Il ne renvoie aucun terme s'il est utilisé avec plusieurs types de publication comme celui-ci
$flags = wpse57444_get_terms('flags', array('post_types' => array('country','city')));
. En effet, $ wpdb-> prepare assainit la chaîne $ post_types_strp.post_type IN('country,city')
pendant qu'elle devrait l'êtrep.post_type IN('country','city')
. Voir ce billet: 11102 . Utilisez la solution de cette rubrique pour contourner ce problème: /programming//a/10634225la source
J'ai également essayé d'utiliser la réponse de @Stephen Harris, mais la requête dont j'avais besoin était assez difficile à écrire en tant que requête unique et en utilisant les éléments de filtre.
En outre, j'ai également dû utiliser cette fonction plusieurs fois dans la même page et j'ai résolu le problème de déclaration de la
wpse_filter_terms_by_cpt
fonction en dehors de la fonction wrapper.Quoi qu'il en soit, la réponse de @Mark Pruce correspond à mon avis, pour les mêmes raisons, a-t-il dit, même si vous avez besoin de faire une autre requête (et la boucle associée) pour préparer les arguments de la
wp_get_object_terms
fonction.la source