Как создать шаблон страницы для определённой рубрики в WordPress. Создаём шаблон для списка новостей

3

Зачем это нужно?

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

Как вывести записи по рубрике?

Например, у вас есть рубрика news

  1. Создайте в корне темы файл с названием news.php
  2. Скопируйте в news.php содержание файла page.php вашей темы
  3. В файле, после @package ХХХХХХ (ХХХХХ название темы или производителя темы) пропишите Template Name: news
  4. Далее мы изменим цикл вывода записей,
<?php
/*
* @package Название вашей темы
* Template Name: News
**/
get_header();
$recent = new WP_Query("category_name=news");
while($recent->have_posts()) : $recent->the_post();

?> 

<!-- Ваш код -->

<?php endwhile; ?>
<?php 
get_footer();

в котором category_name=news news название вашей рубрики, или напишите category_id=12, 12 – идентификатор рубрики.

Идентификатор рубрики можно быстро получить с помощью плагина Reveal ID. Вывод с помощью идентификаторов вам пригодиться, если ваши рубрики названы на русском языке.

У вас уже есть цикл. Внутри цикла разместите Вашу верстку и вывод нужных для вас данных.

Пример

<?php
/*
* @package Название вашей темы
* Template Name: News
**/
get_header();
$recent = new WP_Query("category_name=news");
while($recent->have_posts()) : $recent->the_post();

?> 

<div class="card">
    <?php 
        the_title('<h2 class="news__title">', '</h2>'); 
    ?>
    <div class="card-body">
        <?php 
            echo get_the_post_thumbnail(); 
            the_excerpt();
        ?>
        <a class="buttom buttom-primary" href="<?php echo get_permalink(); ?>">Подпробнее</a>        
    </div>
</div>

<?php endwhile; 
get_footer();

Через произвольные типы записей

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

Допустим мы решили сделать страницу с портфолио на нашем сайте с помощью произвольных типов полей. В этом нам нужно создать отдельный php файл и подключить в файле темы functions.php

// Portfolio
define('TEMPL_DIR', get_template_directory());
if( file_exists( TEMPL_DIR . '/portfolio.php' )){
    require_once TEMPL_DIR . '/portfolio.php';
}

В самом файле portfolio.php мы пишем следующее:

register_post_type('portfolio',
    array(
        'labels'      => array(
            'name'          => __('Portfolio'),
            'singular_name' => __('Project'),
        ),
        'show_ui' => true,
        'show_in_menu'        => true,
        'public'      => true,
        'has_archive' => true,
        'rewrite'     => array( 'slug' => 'portfolio' ),
    )
); // Создание нового типа записей
flush_rewrite_rules(); // Обновление правил перенаправления в WP
add_post_type_support( 'portfolio', array('title', 'editor', 'author', 'thumbnail', 'excerpt') );
add_filter( 'template_include', 'xakpl_template_redirect_archive' );
function xakpl_template_redirect_archive( $original_template ){
    if( is_archive() && get_post_type() == 'portfolio'){
        return TEMPL_DIR . '/portfolio-template.php'; // Перенаправляем страницу списка записей на наш файл.
    } else {
        return $original_template;
    }
}

Теперь создаём новый шаблон в файле portfolio-template.php

<?php
/*
* @package Название вашей темы
* Template Name: News
**/
get_header();
while(have_posts()) : the_post();

?> 

<div class="card">
    <?php 
        the_title('<h2 class="news__title">', '</h2>'); 
    ?>
    <div class="card-body">
        <?php 
            echo get_the_post_thumbnail(); 
            the_excerpt();
        ?>
        <a class="buttom buttom-primary" href="<?php echo get_permalink(); ?>">Подпробнее</a>        
    </div>
</div>

<?php endwhile; 
get_footer();

В отличие от прошлого способа, в этом не нужно изменять объект цикла.

P.S.

Если у вас что-то не получилось, то не стесняйтесь задавать вопросы в комментариях или написать мне в VK (ссылка в футере)