Создаем кастомный тип записи (Custom Post Type) с кастомными категориями (Custom Taxonomy)

25.01.2017

Создаем кастомный тип записи (Custom Post Type) News с кастомными категориями (Custom Taxonomy) News Category.

В моем случае все стандартные записи — это приложения, а Новости выведем через кастомные записи.

В файле функций регистрируем кастомный тип записи News:

add_action( 'init', 'create_post_types' );
function create_post_types() {
  register_post_type(
    'news', 
    array(
      'labels' => array( 
        'name' => __( 'News' ),
        'singular_name' => __( 'News' ) ),
      'show_ui' => true,
      'publicly_queryable' => true,
      'exclude_from_search' => true,
      'menu_position' => 5,
      'query_var' => true,
      'supports' => array( 'title', 'editor', 'thumbnail', 'excerpt', 'comments' ),
      'public' => true
      )
    );
}

Затем для типа записи News регистрируем таксономии, чтобы разные записи могли принадлежать разным категориям.

add_action( 'init', 'custom_terms' );
function custom_terms() {
  register_taxonomy(
    'news_category',
    array('news'),

    array(
      'labels' => array(
        'name' => 'News Category',
        'add_new_item' => 'Add New Category',
        'new_item_name' => "New Category"
        ),
      'rewrite' => array( 'slug' => 'blog' ), // меняем слаг 'news_category' на слаг 'blog'
      'show_ui' => true,
      'show_tagcloud' => false,
      'hierarchical' => true
      )
    );
}

Зарегистрировать это все дело не сложно. Больше примеров можно найти здесь и здесь.

Теперь нужно вывести эти записи на странице.

Вариант 1. Просто выводим все кастомные записи News на странице с заданным шаблоном

 

<?php 
$args = array( 'post_type' => 'news', 'posts_per_page' => -1 );
$loop = new WP_Query( $args );
while ( $loop->have_posts() ) : $loop->the_post(); 

get_template_part( 'include/blog-post' );

endwhile; ?>

get_template_part( 'include/blog-post' ); — в файле blog-post.php я вывожу loop, который нужен мне для отображения записи внутри цикла (заголовок, миниатюру, дату, цитату и т.д.)

Этот вариант выводит все записи News на странице, не зависимо от таксономий (категорий).

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

Вариант 2. Выведем записи принадлежащие конкретной таксономии

 

Создаем файл taxonomy-news_category.php или копируем свой файл category.php или index.php и переименовываем в taxonomy-news_category.php.
И перед стандартным loop добавляем такой код:

<?php $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); ?>
<?php query_posts(array( 'post_type'=>'news', 'news_category'=>$term->slug)); ?>

Я не знаю, какой шаблон там у вас, но у меня получается такой код между подключением хедера и футера:

<?php $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); ?>
<?php query_posts(array( 'post_type'=>'news', 'news_category'=>$term->slug)); ?>

<?php if (have_posts()) : ?>
  <?php while (have_posts()) : the_post(); ?>
    <?php get_template_part( 'include/blog-post' ); ?>
  <?php endwhile; ?>

  <?php get_template_part('include/navigation'); ?>

<?php else : ?>
  <p class="sorry">Sorry, no posts matched your criteria.</p>
<?php endif; ?>
<?php wp_reset_query(); ?>

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

При этом, если вы используете плагин Yoast SEO и используете его хлебные крошки:

<?php
if ( function_exists('yoast_breadcrumb') ) {
yoast_breadcrumb('
<p id="breadcrumbs">','</p>
');
}
?>

Тогда при выборе в настройках плагина таксономии «News Category» в «Taxonomy to show in breadcrumbs for post types», в хлебных крошках вы получите ссылку на категорию, к которой принадлежит Новость, при других вариантах вывода кастомных записей это не получалось сделать.

Taxonomy to show in breadcrumbs for post types

Не уходи, пока не прочитаешь:

Комментарии (2) к “Создаем кастомный тип записи (Custom Post Type) с кастомными категориями (Custom Taxonomy)”

  • Dana

    Перед собой ставил задачу создания каталога, поэтому ковырял варез — Gravity Forms. К сожалению Gravity Forms не дает возможности публиковать контент в пользовательских типах, только в типах данных post. Если кто поможет решить проблему — буду рад!

    Ответить
    • Denis Creative

      Я не совсем понял, в чем была суть задачи и какая цель…
      Gravity Forms — это, вроде, обычный плагин форм как и Contact Form 7, может для публикации контента лучше подойдет плагин Frontend Post WordPress Plugin?

      Ответить

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