Grupare WP_Query după categorie
OK, iată configurația mea:
Tip de postare personalizat numit "issues" (pentru o revistă) Postări cu câmp meta personalizat care se potrivește cu ID-ul postării pentru numărul corespunzător.
Când sunt pe o pagină de postare individuală "issue", vreau să interoghez toate postările asociate și să le afișez grupate după categoria lor asociată. Am reușit să fac interogarea de postări, dar nu reușesc să înțeleg cum să fac gruparea pe categorii.
Iată interogarea mea:
<?php
global $post;
// Listare postări după termenii unei taxonomii personalizate pentru orice tip de postare
$current = get_the_ID($post->ID);
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'title',
'meta_key' => '_rkv_issue_select',
'meta_value' => $current
);
$issue_cats = new WP_Query($args);
if( $issue_cats->have_posts() ) :
?>
<ul>
<?php while ( $issue_cats->have_posts() ) : $issue_cats->the_post(); ?>
<li><?php the_title(); ?></li>
<?php endwhile; // sfârșitul buclei ?>
<?php else : ?>
<?php endif; // if have_posts() ?>
</ul>
<?php wp_reset_query(); ?>
Ai putea să modifici WP_Query cu o comandă SQL pentru a le grupa, dar asta depășește nivelul meu actual de cunoștințe MySQL. În schimb, am obișnuit să fac acest lucru rulând un foreach pe taxonomia în sine folosind http://codex.wordpress.org/Function_Reference/get_categories.
Iată un exemplu de cod:
<?php
global $post;
$current = get_the_ID($post->ID);
$cargs = array(
'child_of' => 0,
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'taxonomy' => 'category', //schimbă aceasta la orice taxonomie
);
foreach (get_categories($cargs) as $tax) :
// Listează postări după termenii pentru o taxonomie personalizată a oricărui tip de postare
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'title',
'meta_key' => '_rkv_issue_select',
'meta_value' => $current,
'tax_query' => array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => $tax->slug
)
)
);
if (get_posts($args)) :
?>
<h2><?php echo $tax->name; ?></h2>
<ul>
<?php foreach(get_posts($args) as $p) : ?>
<li><a href="<?php echo get_permalink($p); ?>"><?php echo $p->post_title; ?></a></li>
<?php endforeach; ?>
</ul>
<?php
endif;
endforeach;
?>
Acest cod va parcurge fiecare categorie cu postări (hide_empty este setat pe true) și va face o interogare get_posts pentru aceasta (de asemenea, verifică dacă există postări înainte de a afișa orice).
Nu eram sigur ce antet dorești pentru a separa grupurile, așa că am folosit un h2 și am adăugat și un link la listare.
Am schimbat la get_posts pentru că am constatat că este mai eficient, deoarece nu suprascrie variabila globală $post (mai puține interogări la baza de date, utilizare redusă a wp_reset_query()).

Aceasta este o metodă ineficientă de a face acest lucru, dacă ai multe categorii preluate, deoarece pentru fiecare categorie faci un apel get_posts separat, care interoghează baza de date de fiecare dată.

Mulțumesc pentru acest răspuns, m-am tot chinuit să găsesc o modalitate de a grupa rezultatele pentru taxonomii...
