Группировка WP_Query по категориям в WordPress
OK, вот моя структура:
Пользовательский тип записи "issues" (для журнала) Записи с пользовательским метаполем, соответствующим ID записи соответствующего выпуска.
Когда я нахожусь на странице отдельного выпуска, я хочу получить все связанные записи и отобразить их сгруппированными по связанным категориям. У меня работает сам запрос записей, но я не могу разобраться с группировкой по категориям.
Вот мой запрос:
<?php
global $post;
// Получаем записи по терминам произвольной таксономии для любого типа записи
$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; // конец цикла ?>
<?php else : ?>
<?php endif; // если есть записи ?>
</ul>
<?php wp_reset_query(); ?>
Вы можете попробовать изменить WP_Query с помощью SQL-команды для группировки, но это немного выходит за рамки моих текущих знаний MySQL. Однако я всегда делал это, перебирая таксономию с помощью http://codex.wordpress.org/Function_Reference/get_categories
Вот пример кода:
<?php
global $post;
$current = get_the_ID($post->ID);
$cargs = array(
'child_of' => 0, // Дочерние категории
'orderby' => 'name', // Сортировка по имени
'order' => 'ASC', // По возрастанию
'hide_empty' => 1, // Скрыть пустые
'taxonomy' => 'category', // Измените на нужную таксономию
);
foreach (get_categories($cargs) as $tax) :
// Вывод записей по терминам для произвольной таксономии любого типа записи
$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;
?>
Этот код перебирает все категории с записями (hide_empty установлен в true) и выполняет get_posts для каждой (а также проверяет наличие записей перед выводом).
Я не был уверен, какой заголовок вы хотите использовать для разделения групп, поэтому использовал h2 и добавил ссылки на записи.
Я изменил WP_Query на get_posts, так как это более эффективно - не перезаписывает глобальную переменную $post (меньше запросов к базе данных, меньше необходимости в wp_reset_query()).

Это не самый эффективный способ, если у вас много категорий, так как для каждой категории вы делаете отдельный вызов get_posts, который каждый раз обращается к базе данных.

Спасибо за этот ответ, я уже бился головой об стену, пытаясь найти способ группировать результаты для таксономий...
