Создаем кастомный тип записи (Custom Post Type) с кастомными категориями (Custom Taxonomy), полная инструкция.
Создаем кастомный тип записи (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», в хлебных крошках вы получите ссылку на категорию, к которой принадлежит Новость, при других вариантах вывода кастомных записей это не получалось сделать.