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

25.01.2017

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

Это будет наиболее полезная статья по Custom Post Type

В моем случае все стандартные записи — это Товары, поэтому Статьи выведем через кастомные записи.

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

function wptp_create_post_type() {
  $labels = array( 
    'name' => __( 'Articles' ),
    'singular_name' => __( 'Articles' ),
    'add_new' => __( 'New Article' ),
    'add_new_item' => __( 'Add New Article' ),
    'edit_item' => __( 'Edit Article' ),
    'new_item' => __( 'New Article' ),
    'view_item' => __( 'View Article' ),
    'search_items' => __( 'Search Articles' ),
    'not_found' =>  __( 'No Articles Found' ),
    'not_found_in_trash' => __( 'No Articles found in Trash' ),
    );
  $args = array(
    'labels' => $labels,
    'has_archive' => true,
    'public' => true,
    'hierarchical' => false,
    'menu_position' => 5,
    'supports' => array(
      'title', 
      'editor', 
      'excerpt', 
      'custom-fields', 
      'thumbnail'
      ),
    );
  register_post_type( 'articles', $args );
} 
add_action( 'init', 'wptp_create_post_type' );

Если вы хотите, чтобы в кастомных постах выводились стандартные категории, тогда привяжите их к таксономии Категорий:

    'taxonomies' => array('category'), 

Если для кастомных постов вы создаете еще и кастомные таксономии, то связывать их надо с созданными таксономиями, если брать пример ниже, то это будут articles_category

    'taxonomies' => array('articles_category'), 

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

function wptp_register_taxonomy() {
  register_taxonomy( 'articles_category', 'articles',
    array(
      'labels' => array(
        'name'              => 'Article Categories',
        'singular_name'     => 'Article Category',
        'search_items'      => 'Search Article Categories',
        'all_items'         => 'All Article Categories',
        'edit_item'         => 'Edit Article Categories',
        'update_item'       => 'Update Article Category',
        'add_new_item'      => 'Add New Article Category',
        'new_item_name'     => 'New Article Category Name',
        'menu_name'         => 'Article Category',
        ),
      'hierarchical' => true,
      'sort' => true,
      'args' => array( 'orderby' => 'term_order' ),
      'show_admin_column' => true
      )
    );
}
add_action( 'init', 'wptp_register_taxonomy' );

Для кастомной таксономии можно изменить слаг на более красивый, чтобы он не был articles_category, но нужно учесть, чтобы таких слдагов больше не было на других страницах или постах, иначе будут проблемы:

      'rewrite' => array( 'slug' => 'blog' ),

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

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

За внешний вид кастомной записи отвечает файл single.php, но чтобы изменить вид кастомной записи можно создать файл single-{post_type}.php — в моем случае будет single-articles.php со своим содержимым.

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

Вариант 1 — самый правильный. Выводим записи в таксономии так же как и в обычной категории.

Для этого создаем файл taxonomy-{taxonomy}.php — в моем случае будет taxonomy-articles_category.php и в нем выводим обычный цикл, как и для стандартных записей в категории:

<div class="container">
  <div class="row">
    <div class="col-md-12">
      <div class="cat-title"><?php single_cat_title(); ?></div>

      <div class="tax-wrap">
        <?php if ( have_posts() ) : while ( have_posts() ) : the_post();
        get_template_part( 'include/tax-item' ); 
        endwhile; 
        get_template_part('include/pagination'); 
        endif; ?>
      </div><!-- /tax-wrap -->

    </div><!-- /col-md-12 -->
  </div><!-- /row -->
</div><!-- /container -->

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

В файле pagination.php выводим пагинацию вот такого формата.

Цикл не изменяем, пагинация отлично работает. Это самый оптимальный вариант для отображения Кастомных Таксономий.
 

Вариант 2 — если нет кастомных таксономий, то можно просто получить все кастомные записи в виде Архива

Для этого в шаблоне создаем файл archive-{post_type}.php — в моем случае будет archive-articles.php, в котором точно так же как и в таксономии выводим обычный цикл, только вместо заголовка Таксономии выводим имя кастомного типа записи :

<div class="container">
  <div class="row">
    <div class="col-md-12">
      <div class="cat-title"><?php post_type_archive_title(); ?></div>

      <div class="tax-wrap">
        <?php if ( have_posts() ) : while ( have_posts() ) : the_post();
        get_template_part( 'include/tax-item' ); 
        endwhile; 
        get_template_part('include/pagination'); 
        endif; ?>
      </div><!-- /tax-wrap -->

    </div><!-- /col-md-12 -->
  </div><!-- /row -->
</div><!-- /container -->

При этом варианте, если не создана страница архива для кастомной записи, тогда получить список всех кастомных записей можно по прямой ссылке BLOG_URL?post_type={post_type} или в моем случае http://site.com/articles/.
 

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

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

get_template_part( 'include/tax-item' );

endwhile; ?>

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

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

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

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

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

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

Taxonomy to show in breadcrumbs for post types

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

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

  • Dana

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

    Ответить
    • Denis Creative

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

      Ответить
  • Александр

    Добрый день!

    Я создаю без кастомной таксономии, но всё равно шаблон archive-articles.php не цепляется, а выводится посредством index.php
    Может еще что-то менять надо?

    Ответить
  • Роман

    Подскажите пожалуйста, можно ли сделать так, чтобы эти кастомные поля имели в конце префикс .html?

    Ответить
  • psinka

    долго мучался, несколько дней, создавал архив произвольных записей, но 404 ошибка выдавала при переходе…
    оказалось, что в плагине, через который создал типы записей, напротив пункта Archive был параметр False…
    так что внимательнее!

    Ответить
  • Слава

    Привет, такой вопрос. Если я хочу вывести все записи произвольного типа, но помимо них на странице вывода должен присутствовать другой контент, который должен редактироваться с админки (именно для этой страницы), как это лучше сделать? Если через архив — тогда нет места для редактирования контента, но все в порядке и с урлами и с хлебными крошками. Если через шаблон страницы — все отлично с контентом: все редактируется на одной странице, но возникает куча проблем: кривые крошки, перенаправления, дубли страниц и каша с урлами. Получается так или иначе нужно что-то костылять. Каким образом лучше и правильнее все это сделать? (например когда есть несколько типов записи со своми таксономиями). Буду благодарен за ответ.

    Ответить
    • Denis Creative

      Если я правильно понял вопрос, то можно ведь в таксономии вывести description с помощью кода <?php echo category_description(); ?> и в нем создать контент, который можно будет редактировать.

      Ответить

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