web-dev-qa-db-fra.com

wp_get_object_terms () pour obtenir une liste de tous les termes attachés à tous les articles de la requête en cours

Comment utiliser wp_get_object_terms () pour obtenir une liste de tous les termes attachés à toutes les publications de la requête en cours?

Par exemple, pour la requête en cours, je souhaite obtenir un tableau des termes de la taxonomie "Alfa" contenus dans toutes les publications interrogées.

wp_get_object_terms($wp_query, 'alfa');

Mais cela ne semble que renvoyer un élément du tableau ...

Je fais ceci pour construire un tableau permettant de vérifier une taxonomie avec une autre pour un menu de navigation, et le fais actuellement avec le code suivant, mais je pense qu'il doit y avoir une meilleure façon.

S'il vous plaît aider! Merci!

$queried_terms = array();
if ( $wp_query->have_posts() ) : while ( $wp_query->have_posts() ) : $wp_query->the_post();
    $postid = $post->ID; 

    if( has_term( '', 'alfa', $postid) ) {
        $terms = get_the_terms( $postid, 'alfa' );
        foreach($terms as $term) {
            $queried_terms[] = $term->slug;
        }
    }

endwhile; endif;
rewind_posts();
wp_reset_query();

$queried_terms = array_unique($queried_terms);
4
j-man86

Je pense que vous êtes sur la bonne voie car wp_get_object_terms() peut prendre un tableau d’ID pour son premier argument, c’est juste que $ wp_query n’est pas le tableau que vous voulez.

Je ne peux pas garantir que cela soit plus efficace (ce n'est pas mon domaine d'expertise), mais je crois que cet extrait de code [partiellement testé] ferait ce que vous voulez avec au moins une boucle de moins et pas de array_unique():

// get $wp_query
global $wp_query;
// get array of post objects    
$my_posts = $wp_query -> posts;
// make array for the post IDs
$my_post_ids = array();
// loop through posts array for IDs
foreach( $my_posts as $my_post ) {
    $my_post_ids[] = $my_post->ID;
}
// get the terms
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );

wp_get_object_terms() prend un 3ème paramètre $args que vous devrez peut-être définir pour obtenir le résultat souhaité, mais je vous le laisserai.

UPDATE: Cela peut être encore plus court en utilisant la fonction new-to-me wp_list_pluck() . Encore une fois, cela n'a pas été testé, mais cela semble correct

// get $wp_query
global $wp_query;
// get array of post objects    
$my_posts = $wp_query -> posts;
// NEW: make array of the post IDs in one step
$my_post_ids = wp_list_pluck( $my_posts, 'ID' );
// get the terms
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );

Vous pouvez voir dans le code source que cela exécute le même code de boucles foreach, mais cela semble un peu plus agréable.

3
mrwweb

Cette généralisation de ci-dessus a fonctionné pour moi:

$args = array( 'cat' = -1 ); // e.g. to get list of posts in any category
$postobjs = get_posts( $args );
$postids = wp_list_pluck( $postobjs, 'ID' );
$taxonomy = 'mytax' // your taxonomy name
$termobjs = wp_get_object_terms( $postids, $taxonomy );
$termlist = array_unique( wp_list_pluck( $termobjs, 'name' ) ); // distinct term names

Il génère une liste unique de termes dans la taxonomie personnalisée "mytax". Merci @mrwweb :-)

2
Jon