web-dev-qa-db-fra.com

get_terms avec des articles dont la taxonomie est différente avec le terme x

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

1
epluribusunum

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.

1
Alexander Holsgrove

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().

1
Jacob Peattie