Agrupar WP_Query por categoría
OK, esta es mi configuración:
Tipo de publicación personalizado llamado "issues" (para una revista) Publicaciones con un campo meta personalizado que coincide con el ID de la publicación del issue correspondiente.
Cuando estoy en una página de publicación individual de "issue", quiero consultar todas las publicaciones relacionadas y mostrarlas agrupadas por su categoría asociada. Tengo la consulta de publicaciones funcionando, pero no logro entender cómo hacer la agrupación por categoría.
Aquí está mi consulta:
<?php
global $post;
// Listar publicaciones por los términos de una taxonomía personalizada de cualquier tipo de publicación
$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; // fin del bucle ?>
<?php else : ?>
<?php endif; // if have_posts() ?>
</ul>
<?php wp_reset_query(); ?>

Podrías considerar modificar WP_Query con un comando SQL para agruparlos, pero eso está un poco más allá de mi conocimiento actual de MySQL. Sin embargo, siempre lo he hecho ejecutando un foreach sobre la taxonomía misma con esta http://codex.wordpress.org/Function_Reference/get_categories
Aquí tienes un código de ejemplo:
<?php
global $post;
$current = get_the_ID($post->ID);
$cargs = array(
'child_of' => 0,
'orderby' => 'name',
'order' => 'ASC',
'hide_empty' => 1,
'taxonomy' => 'category', //cambia esto por cualquier taxonomía
);
foreach (get_categories($cargs) as $tax) :
// Listar posts por los términos de una taxonomía personalizada para cualquier tipo de post
$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;
?>
Esto recorrerá cada categoría que tenga posts (hide_empty está configurado como verdadero) y realizará un get_posts sobre esa categoría (además verifica que tenga posts antes de mostrar cualquier cosa).
No estaba seguro de qué querías como encabezado para separar los grupos, así que usé un h2 y añadí un enlace al listado también.
Lo cambié a get_posts porque he encontrado que es más eficiente ya que no sobreescribe la variable global $post (menos llamadas a la base de datos, menos uso de wp_reset_query()).

Esta es una forma un poco ineficiente de hacerlo, si tienes muchas categorías recuperadas, ya que por cada categoría haces una llamada get_posts separada que consulta la base de datos cada vez.

Gracias por esta respuesta, me estaba rompiendo la cabeza para encontrar una forma de agrupar resultados para taxonomías...
