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

В этом уроке мы расскажем, как сделать вывод последних постов по каждой рубрике WordPress на одной странице.

Смотрите также:

Вот наглядная демо-версия того, что мы собираемся сделать в этом уроке:

И сегодня мы рассмотрим, как это сделать. А именно:

  • Определить все рубрики для блога
  • Вывести последние посты для каждой из них с миниатюрой изображения, если такая имеется
  • Убедиться, что нет дубликатов рубрик
  • Красиво оформить внешний вид рубрик

Что нам понадобится?

Чтобы сегодняшнее руководство было для вас полезным в практическом смысле, вам необходимо:

  • Наличие непосредственно самого сайта на WordPress
  • Несколько записей из разных рубрик
  • Тема. Мы создадим дочернюю тему стандартной темы WordPress — Twenty Fourteen
  • Редактор кода

Настройка дочерней темы

Начнем с установки темы. Создадим дочернюю тему Twenty Fourteen с помощью только двух файлов: style.css и index.php. Вот так выглядит наша таблица стилей для новой дочерней темы:

/*
Theme Name: Display the Most Recent Post in Each Category
Theme URI: http://code.tutsplus.com/tutorials/display-the-most-recent-post-in-each-category--cms-22677
Version: 1.0.0
Description: Theme to accompany tutorial on displaying the most recent post fort each term in a taxonomy for Tutsplus, at http://bitly.com/14cm0yb
Author: Rachel McCollin
Author URI: http://rachelmccollin.co.uk
License: GPL-3.0+
License URI: http://www.gnu.org/licenses/gpl-3.0.html
Domain Path: /lang
Text Domain: tutsplus
Template: twentyfourteen
*/
 
@import url('../twentyfourteen/style.css');

Мы вернемся к этому файлу в самом конце при оформлении рубрик, а на данном этапе этого достаточно, чтобы WordPress распознал дочернюю тему.

Создаем файл главной страницы

Так как мы поставили перед собой цель вывести последние посты из каждой рубрики на главной странице, то нам нужно создать новый файл index.php в только что созданной нами дочерней теме.

Создаем пустой файл index.php

Для начала скопируем файл index.php из темы Twenty Fourteen и отредактируем код с блоком цикла вместе с остальным контентом. Вот как он должен выглядеть:

<?php
/**
 * The main template file.
 * 
 * Based on the `index.php` file from TwentyFourteen, with an edited version of the `content.php` include file from that theme included here.
 */
?>
 
<?php get_header(); ?>
 
<div id="main-content" class="main-content">
 
    <?php
        if ( is_front_page() && twentyfourteen_has_featured_posts() ) {
 
            // Include the featured content template.
            get_template_part( 'featured-content' );
 
        }
    ?>
 
    <div id="primary" class="content-area">
        <div id="content" class="site-content" role="main">
 
        </div>
    </div>
    <?php get_sidebar( 'content' ); ?>
</div>
 
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Определяем рубрики

Для определения рубрик в блоге нужно сразу же после открытия тега <div id="content"> добавить:

<?php
    $categories = get_categories(); 
 
    foreach ( $categories as $category ) {
 
    }
?>

При этом используется функция get_categories() для составления списка рубрик. По умолчанию список отображается в алфавитном порядке, а пустые рубрики в него включены не будут. И для этого не нужно добавлять никаких дополнительных аргументов.

Затем с помощью foreach ( $categories as $category ) {} мы заявляем WordPress, чтобы он использовал каждую из этих рубрик и код внутри скобок. Затем нужно создать запрос для каждой из этих рубрик.

Определяем аргументы для запросов

Теперь нужно определить аргументы для запроса. Внутри скобок нужно добавить следующий код:

$args = array(
    'cat' => $category->term_id,
    'post_type' => 'post',
    'posts_per_page' => '1',
);

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

Используем запрос

Вставляем запрос с помощью класса WP_Query:

$query = new WP_Query( $args );
 
if ( $query->have_posts() ) { ?>
 
    <section class="<?php echo $category->name; ?> listing">
        <h2>Latest in <?php echo $category->name; ?>:</h2>
 
        <?php while ( $query->have_posts() ) {
 
            $query->the_post();
            ?>
 
            <article id="post-<?php the_ID(); ?>" <?php post_class( 'category-listing' ); ?>>
                <?php if ( has_post_thumbnail() ) { ?>
                    <a href="<?php the_permalink(); ?>">
                        <?php the_post_thumbnail( 'thumbnail' ); ?>
                    </a>
                <?php } ?>
 
                <h3 class="entry-title">
                    <a href="<?php the_permalink(); ?>">
                        <?php the_title(); ?>
                    </a>
                </h3>
 
                <?php the_excerpt( __( 'Continue Reading <span class="meta-nav">&rarr;</span>', 'twentyfourteen' ) ); ?>
 
            </article>
 
        <?php } // end while ?>
 
    </section>
 
<?php } // end if
 
// Use reset to restore original query.
wp_reset_postdata();

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

Вот как это выглядит:

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

Как избежать дублирования записей?

Над строкой, где вы добавили функцию get_categories(), добавьте следующую строку:

$do_not_duplicate = array();

Это создаст пустой массив $do_not_duplicate, в котором мы разместим ID каждого выводимого поста. А затем проверим, что ID каждого из постов, для которого был создан запрос, находится в этом массиве.

Затем добавьте новую строку под выбранным запросом, и в результате первые две строки будут выглядеть таким образом:

<?php while ( $query->have_posts() ) {
 
    $query->the_post();
 
    $do_not_duplicate[] = $post->ID;
    ?>

Так ID актуального поста будет добавлен в массив $do_not_duplicate.

И наконец добавляем новый аргумент в аргументы запросов, чтобы избежать вывода каких-либо постов в этом массиве. Аргументы должны выглядеть вот так:

$args = array(
    'cat' => $category->term_id,
    'post_type' => 'post',
    'posts_per_page' => '1',
    'post__not_in' => $do_not_duplicate
);

Для этого использовался аргумент 'post__not_in', который ищет массив ID всех записей.

Сохраните свой файл index.php и смотрите, что получилось:

Как видите, записи уже не дублируются.

Оформляем стили для главной страницы

Давайте придадим нашим рубрикам привлекательный внешний вид и немного оформим главную страницу. Самый простой способ – добавить миниатюру и разместить ее по левую сторону от записи.

Для этого в файл темы style.css нужно добавить следующий код:

.listing h2 {
    margin-left: 10px;
}
 
.category-listing img {
    float: left;
    margin: 10px 2%;
}
 
.category-listing .entry-title {
    clear: none;
}

Сейчас страница выглядит намного привлекательней, не правда ли?

Как применить эту технику под разные типы контента?

Эту технику можно применить для разных типов контента или таксономий. Например:

  • Если нужно использовать кастомную таксономию в рубриках, то для этого стоит заменить get_categories() на get_terms(), а также изменить аргумент запроса 'cat' на тот, который ищет названия таксономий.
  • При работе с разными типами постов нужно добавить такой же код в файл шаблона, который будет выводить этот тип поста, заменив аргумент 'post_type' => 'post' в запросе аргумента на ваш тип поста.
  • Чтобы создать страницу отдельную от основного блога и вывести последний пост любого типа поста для конкретной таксономии, нужно создать шаблон архива таксономии и добавить к нему адаптированную версию этого кода.
  • Точно так же можно использовать эту технику с несколькими таксономиями или типами постов с помощью foreach и использовать несколько циклов.
  • Можно использовать вышеуказанный код и добавить его в файл страницы single.php, чтобы вывести ссылку на последний пост в каждой категории после содержимого самого поста. Если это сделать, то понадобится еще добавить ID нынешней страницы, которая выводится в массиве $do_not_duplicate.

Заключение

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

Источник: code.tutsplus.com

Вам понравился материал?

Добавить комментарий

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.

7 комментариев

сначала новые
по рейтингу сначала новые по хронологии

Здравствуйте. А как сделать, чтобы выводить по одному посту не из всех категорий, а из некоторых?

Карина

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

Спасибо за труды, вот прям то что нужно было

Эльдар

Подскажите а как сделать, что бы на главной отображались рубрики с 4-5 новыми постами, как здесь например http://woman-max1.esy.es/ Спасибо. Очень нужно

В большинстве случаев это зависит от верстки темы оформления. Если это не предусмотрено в самой теме, то только с помощью плагинов (поищите что-то типа homepage featured content) либо самому переписывать код главной страницы темы index.php

Алексей

Подскажите, пожалуйста, как добавить пагинацию категорий?