Список WordPress постов сгруппированный по рубрикам

Иногда необходимо показать WordPress записи на главной странице сайта, сгруппированные по рубрикам. Основной функционал WordPress не позволяет этого сделать, но сгруппировать посты по категориям можно с помощью добавления php кода в основной цикл WordPress.

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

Ввыводим сгруппированные по рубрикам WordPress записи

Чтобы реализовать подобный вывод записей, необходимо отредактировать стандартный цикл WordPress примерно следующим образом:

<?php $cats = get_categories(); // Получаем список всех категорий
foreach ($cats as $cat) {
 echo "<h3>".$cat->cat_name."</h3>"; // Получаем название одной категории
 echo "<ul class='uldotted'>";
 query_posts('posts_per_page=-1&cat='.$cat->cat_ID); // изменяем параметры основного цикла WordPress и затем выводим посты
 while(have_posts()) {
 the_post();
 $category = get_the_category(); // получаем список категорий для одного поста

 if ($category[0]->cat_ID == $cat->cat_ID) { // Сравниваем список всех категорий с ID первой категории этого поста, и если совпадает, то выводим ссылку на пост только один раз, даже если он указан в нескольких категориях
 echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
 }
 }
 echo "</ul>";
}
?>

 Группируем записи произвольного типа по значениям таксономий

Все написанное выше касается только стандартных WordPress записей и рубрик. Если вам нужно сгруппировать по таксономиям записи произвольного типа, то код необходимо немного модернизировать.

<?php
$settings = array(
 'taxonomy' => 'product_cat' 
);
$cats = get_categories( $settings );
foreach ($cats as $cat) {
 echo "<h3>".$cat->cat_name."</h3>"; 
 $catid = $cat->cat_ID;
 echo "<ul class='uldotted'>";

 $args = array( 
 'post_type' => 'product',
 'posts_per_page' => '-1',
 'tax_query' => array( 
 array( 
 'taxonomy' => 'product_cat', 
 'field' => 'id', 
 'terms' => $catid 
 ) 
 ) 
 ); 

 query_posts( $args );

 while(have_posts()) :
 the_post();
 $category = get_the_terms($post->ID, $settings);
 $first_term = $category['term_id'];
 if ($category[0]->term_id == $cat->cat_ID) : ?>
 <?php woocommerce_get_template_part( 'content', 'product' ); ?>
 <? endif; endwhile;
 echo "</ul>";
}
?>

Эта часть кода написана специально для группировки товаров по категориям в магазине на основе WooCommerce. Но если у вас не магазин, а какой-то другой тип записи, то вам достаточно поменять slug таксономии и post_type на свои значения. Ах, да, еще заменить <?php woocommerce_get_template_part( 'content', 'product' ); ?> на какой-то свой код, с помощью которого будут выводиться записи. Например, можете использовать код из примера выше:

 <? echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>'; ?>

Вот в общем-то и все, что хотелось рассказать вам о группировке WordPress записей по рубрикам и таксономиям. Чуть позже вы сможете узнать, как группировать WordPress записи по алфавиту.