Выводим список всех категорий со списком записей

14.05.2017

На одном из сайтов необходимо было вывести на Главной странице блоками категории, а внутри записи из этих категорий.

Нашел такой вполне рабочий код здесь:

<?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>";
}
?>

Переделав его под свой шаблон, получил такой формат:

<div class="home-wrap">
  <?php $cats = get_categories(); // get list of categories
  foreach ($cats as $cat) { ?>
  <div class='cat-block'>
    <div class="cat-title"><?php echo $cat->cat_name; ?></div>
    <div class='posts-list'>
      <?php query_posts('posts_per_page=5&cat='.$cat->cat_ID);
      while(have_posts()) {
        the_post();
        $category = get_the_category();
        $category_link = get_category_link($cat->cat_ID);
        if ($category[0]->cat_ID == $cat->cat_ID) {
          get_template_part('include/post-item'); //include post content
        }
      } ?>
    </div><!-- /posts-list -->
    <a href="<?php echo esc_url( $category_link ); ?>" class="btn"><?php _e('See more', 'crea'); ?></a>
  </div><!-- /cat-block -->
  <?php } ?>
</div><!-- /home-wrap -->

В файле post-item.php выводим данные, которые нам нужно получить из каждой записи, например, заголовок, ссылку на запись, миниатюру и excerpt.

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

Попытаюсь объяснить проще.

Задача — нужно создать шаблон страницы Ресторанного меню (примитивный пример), на данной странице должны выводиться определенные разделы меню и все блюда, например, на странице Стандартное меню, должны выводиться Первые блюда, Вторые блюда и Салаты, а на Странице Банкетное меню: Коктейльная карта, Алкогольные напитки и Безалкогольные напитки (или что угодно).

Решение:

  • Создаем шаблон страницы Меню с кастомным полем «ID Родительской Категории» cat_id (Создаем с помощью ACF или любым другим способом).
  • Создаем страницу Стандартное меню с шаблоном Меню и страницу Банкетное меню с шаблоном Меню.
  • Создаем категорию Стандартное меню и в ней подкатегории Первые блюда, Вторые блюда и Салаты, создаем категорию Банкетное меню и в ней подкатегории Коктейльная карта, Алкогольные напитки и Безалкогольные напитки. В каждой из дочерних категорий есть свои записи блюд.
  • На странице Стандартное меню выводим ID категории Стандартное меню, а на странице Банкетное меню выводим ID категории Банкетное меню в кастомное поле «ID Родительской Категории».
  • Берем код, который выше и вставляем его в шаблон страницы Меню с небольшим изменением:

меняем:

$cats = get_categories();

на этот код:

// получаем числовое значение ID нужной категории из кастомного поля
$cat_id = (int) get_field('cat_id');

// получем все дочерние категории от заданной по ID родительской категории
$cats = get_categories(
  array( 'parent' => $cat_id )
);

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

В общем, это лишь частный случай применения данного кода, но это позволит не плодить массу шаблонов страниц в вашей теме и создать более гибкую структуру своего сайта.

Полезная инфа:

Оставить комментарий