wp_get_object_terms() pentru a obține o listă cu toți termenii atașați postărilor din interogarea curentă
Cum pot folosi wp_get_object_terms() pentru a obține o listă cu toți termenii atașați postărilor din interogarea curentă?
De exemplu, pentru interogarea curentă vreau să obțin un array cu termenii din taxonomia "Alfa" care sunt conținuți în toate postările interogate.
wp_get_object_terms($wp_query, 'alfa');
Dar funcția pare să returneze doar un singur element în array...
Fac asta pentru a construi un array pentru a verifica o taxonomie cu alta pentru un meniu de navigare și în prezent folosesc următorul cod, dar cred că există o metodă mai bună.
Vă rog ajutați-mă! Mulțumesc!
$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);

Cred că ești pe drumul cel bun deoarece wp_get_object_terms()
poate accepta un array de ID-uri ca prim argument, doar că $wp_query nu este array-ul pe care îl cauți.
Nu pot garanta că aceasta este mai eficientă (nu e domeniul meu de expertiză), dar cred că acest [parțial-testat] fragment ar face ceea ce dorești cu cel puțin un loop mai puțin și fără array_unique()
:
// obține $wp_query
global $wp_query;
// obține array de obiecte post
$my_posts = $wp_query -> posts;
// creează array pentru ID-urile postărilor
$my_post_ids = array();
// loop prin array-ul de postări pentru ID-uri
foreach( $my_posts as $my_post ) {
$my_post_ids[] = $my_post->ID;
}
// obține termenii
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );
wp_get_object_terms()
acceptă un al 3-lea parametru $args
pe care poate fi nevoie să-l setezi pentru a obține output-ul dorit, dar asta îl las pe seama ta.
ACTUALIZARE:
Aceasta poate fi chiar mai scurtă folosind funcția nouă pentru mine wp_list_pluck()
. Din nou, netestat dar arată corect:
// obține $wp_query
global $wp_query;
// obține array de obiecte post
$my_posts = $wp_query -> posts;
// NOU: creează array de ID-uri ale postărilor într-un singur pas
$my_post_ids = wp_list_pluck( $my_posts, 'ID' );
// obține termenii
$my_terms = wp_get_object_terms( $my_post_ids, 'alfa' );
Poți vedea în sursă că rulează același cod cu foreach
loops, dar arată puțin mai elegant.

Această generalizare a funcționat pentru mine:
$args = array( 'cat' = -1 ); // ex: pentru a obține lista de articole din orice categorie
$postobjs = get_posts( $args );
$postids = wp_list_pluck( $postobjs, 'ID' );
$taxonomy = 'mytax' // numele taxonomiei tale
$termobjs = wp_get_object_terms( $postids, $taxonomy );
$termlist = array_unique( wp_list_pluck( $termobjs, 'name' ) ); // nume de termeni unici
Returnează o listă unică de termeni din taxonomia personalizată 'mytax'. Mulțumesc @mrwweb :-)
