Voici la situation;
J'utilise get_terms pour récupérer tous les termes de Tax 1 avec les messages qui lui sont associés. Utilisation des éléments suivants
$args = array(
'hide_empty' => 0,
'orderby' => 'name',
'taxonomy' => 'tax_1'
);
$terms = get_terms( $args );
Assez simple. Cependant, cela renvoie tous les termes et ne prend pas en compte la deuxième taxonomie Tax 2 que je veux comparer avec term x
En fin de compte, je veux obtenir tous les termes Tax 1 qui ont des messages qui ont également terme Tax 2 x
Je pourrais très probablement effectuer une requête directement sur les messages et créer un tableau de termes où le message contient les deux éléments ci-dessus, mais cela semble un peu compliqué, j'espère qu'il existe un moyen de l'interroger directement.
Merci
Vous pouvez utiliser l'argument tax_query, par exemple:
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'tax1',
'field' => 'slug',
'terms' => $terms,
),
array(
'taxonomy' => 'tax2',
'field' => 'slug',
'terms' => $terms,
)
)
Pour obtenir tous les messages qui ont les deux termes. Vous pouvez ensuite utiliser get_terms et passer le object_ids
comme paramètre. Voir la documentation WP_Term_Query pour plus de détails.
Pour commencer, vous dites "J'utilise get_terms pour récupérer tous les termes de Tax 1 avec les articles qui lui sont associés", cependant votre code réel obtient tous les termes de cette taxonomie, qu'ils aient ou non des articles . Vous devez définir hide_empty
Sur true
.
Donc, avec cela à l'écart, la mauvaise nouvelle: vous ne pourrez pas le faire avec get_terms()
. Ce type d'informations n'existe pas sans interroger les publications et comparer les termes. La solution désordonnée que vous vouliez éviter est donc malheureusement nécessaire.
En fin de compte, je pense que c'est une situation où vous pourriez être mieux en utilisant simplement SQL. Ce code utilisera $wpdb
Pour obtenir des termes de la taxonomie A qui ont des messages d'un type de message donné qui ont un terme spécifique dans la taxonomie B:
$post_type = 'post';
$taxonomy_a = 'post_tag';
$taxonomy_b = 'category';
$term_b_id = 12;
$query = $wpdb->prepare(
"SELECT DISTINCT
terms.*
FROM
`wp_terms` terms
INNER JOIN
`wp_term_taxonomy` tt1 ON
tt1.term_id = terms.term_id
INNER JOIN
`wp_term_relationships` tr1 ON
tr1.term_taxonomy_id = tt1.term_taxonomy_id
INNER JOIN
`wp_posts` p ON
p.ID = tr1.object_id
INNER JOIN
`wp_term_relationships` tr2 ON
tr2.object_ID = p.ID
INNER JOIN
`wp_term_taxonomy` tt2 ON
tt2.term_taxonomy_id = tr2.term_taxonomy_id
WHERE
p.post_type = %s AND
p.post_status = 'publish' AND
tt1.taxonomy = %s AND
tt2.taxonomy = %s AND
tt2.term_id = %d",
[
$post_type,
$taxonomy_a,
$taxonomy_b,
$term_b_id,
]
);
$results = $wpdb->get_results( $query );
if ( $results ) {
$terms = array_map( 'get_term', $results );
}
Ainsi, ce code obtient tous les Tags qui ont Posts qui sont affectés à la Catégorie avec l'ID 12.
Le dernier petit morceau avec get_term()
garantit que le tableau final contient les mêmes objets WP_Term
Que vous obtiendriez en exécutant get_terms()
.