Как создать произвольный тип записей в WordPress

В одной из прошлых заметок мы писали что такое произвольный или пользовательский тип записей в WordPress. Напомним, что типы записей – это термин, используемый для обозначения различных типов контента на сайте WordPress. “Движок” поставляется с 5-ю типами по умолчанию: записи, страницы, вложения, навигационные меню и редакции. Все они хранятся в таблице записей wp_posts базы данных и различаются по столбцу с именем post_type.

Типы записей – это способ различать разные типы контента в WordPress. Например, Записи и Страницы являются типами постов, но они созданы для разных целей (см. Какая разница между записями и страницами в WordPress).

Вместе с типом записей WordPress встречается понятие таксономии. Таксономии используются как способ группировки записей.

WordPress поставляется с двумя таксономиями по умолчанию: категории и теги. Они тоже различаются (см. Какая разница между метками и категориями). Однако в некоторых случаях нужно выйти за рамки категорий и тегов. WordPress позволяет создавать свои собственные таксономии и использовать их в ваших типах записей для группировки и сортировки контента.

Зачем создавать пользовательский тип записей или таксономию?

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

  1. Контент, который вы размещаете на сайте, не выглядит как публикация (например, купоны в интернет-магазине).
  2. Отсутствие какой-либо хронологии публикаций (например, словарь с сортировкой по алфавиту).
  3. Категории и теги не могут группировать и сортировать конкретный контент.
  4. Вам нужны дополнительные поля в записях или на страницах для ввода дополнительной информации.
  5. Вам нужно отобразить конкретный контент не так, как в записях или на страницах.

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

Еще один пример – создание портфолио на сайте художника, фотографа или музыканта. Помимо текстового контента, вы можете создать отдельный раздел с удобными выводом и сортировкой своих работ.

Как создать произвольный тип записей в WordPress?

Существует 2 способа создания произвольного типа записей и его таксономий – с помощью плагина и вручную. Рассмотрим оба способа.

Создание произвольного типа записей с помощью плагина Custom Post Type UI

Первое, что вам нужно сделать, это установить и активировать плагин Custom Post Type UI. После этого в админ-меню появится новый пункт CPT UI.

Админ-меню WordPress

Чтобы создать новый пользовательский тип записей, перейдите CPT UI -> Add/Edit Post Types.

Создание пользовательского типа записей в плагине Custom Post Type UI

В поле Post Type Slug укажите название нового типа записей. Оно должно содержать латинские буквы и цифры. Остальные символы не допускаются.

В качестве примера создадим тип movie (каталог фильмов).

В следующем поле (Plural Label) укажите ярлык для вашего пользовательского типа записей. Это название будет отображаться в админ-панели WordPress, как Записи или Страницы. Поэтому его лучше указывать во множественном числе.

Опция Singular Label представляет единственную форму для вашего типа записей. Это имя будет использоваться WordPress для отображения инструкций и других элементов пользовательского интерфейса.

Также вы можете добавить описание (Post Type Description) для нового типа (необязательно).

Создание пользовательского типа записи в плагине Custom Post Type UI

Теперь вы можете нажать кнопку Add Post Type, чтобы добавить свой новый тип записей.

Все остальные значения блока Additional Labels нужны для отображения элементов нового типа во время операций с ним в админ-панели (добавление, удаление, просмотр, сортировка и т.д.)

Создание произвольного типа записей вручную

Создать новый тип записей WordPress с помощью плагина – легко. Но тут есть одна проблема. Она заключается в том, что после деактивации/удаления этого плагина ваши пользовательские типы записей исчезнут. Конечно, все данные, относящиеся к зарегистрированным типам, останутся. Но такой тип уже не будет зарегистрирован в системе и не будет доступен из области администратора.
Если по каким-либо причинам использование плагина невозможно, вы можете вручную создать собственный тип публикации, добавив необходимый код в файл functions.php активной темы или создав отдельный плагин.

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

function wpschool_create_movies_posttype() {
    register_post_type( 'movies',
        array(
            'labels' => array(
            'name' => __( 'Фильмы' ),
            'singular_name' => __( 'Фильм' )
        ),
        'public' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'movies'),
        )
    );
}
add_action( 'init', 'wpschool_create_movies_posttype' );

Этот код регистрирует в системе новый тип записей movies с массивом аргументов. Этот массив состоит из двух частей. Первая часть представляет собой метки, которые сами по себе тоже являются массивом. Вторая часть содержит другие аргументы, такие как публичная видимость, наличие архива и слага. Они будут использоваться в URL-адресе для этого типа постов.

Теперь рассмотрим код, который добавляет больше опций к вашему типу записей.

function wpschool_create_movies_posttype() {
    $labels = array(
        'name' => _x( 'Фильмы', 'Тип записей Фильмы', 'root' ),
        'singular_name' => _x( 'Фильм', 'Тип записей Фильмы', 'root' ),
        'menu_name' => __( 'Фильмы', 'root' ),
        'all_items' => __( 'Все фильмы', 'root' ),
        'view_item' => __( 'Смотреть фильм', 'root' ),
        'add_new_item' => __( 'Добавить новый фильм', 'root' ),
        'add_new' => __( 'Добавить новый', 'root' ),
        'edit_item' => __( 'Редактировать фильм', 'root' ),
        'update_item' => __( 'Обновить фильм', 'root' ),
        'search_items' => __( 'Искать фильм', 'root' ),
        'not_found' => __( 'Не найдено', 'root' ),
        'not_found_in_trash' => __( 'Не найдено в корзине', 'root' ),
    );

    $args = array(
        'label' => __( 'movies', 'root' ),
        'description' => __( 'Каталог фильмов', 'root' ),
        'labels' => $labels,
        'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'custom-fields', ),
        'taxonomies' => array( 'genres' ),
        'hierarchical' => false,
        'public' => true,
        'show_ui' => true,
        'show_in_menu' => true,
        'show_in_nav_menus' => true,
        'show_in_admin_bar' => true,
        'menu_position' => 5,
        'can_export' => true,
        'has_archive' => true,
        'exclude_from_search' => false,
        'publicly_queryable' => true,
        'capability_type' => 'page',
    );

    register_post_type( 'movies', $args );

}
add_action( 'init', 'wpschool_create_movies_posttype', 0 );

В коде были добавлены еще некоторые опции к пользовательскому типу записей movies (поддержка ревизий, миниатюр, настраиваемых полей и т.д.)

Также этот тип записей был связан с пользовательской таксономией genres (Жанры).

Обратите внимание на многократное использование строки “root”. Это называется текстовым доменом. Если ваша тема готова к переводу, и вы хотите, чтобы ваши собственные типы постов были переведены, вам нужно будет указать текстовый домен, используемый вашей темой. Его можно найти в файле style.css, который находится в каталоге вашей темы. Он будет упомянут в заголовке файла.

Файл style.css темы Root

Как на сайте показать записи пользовательского типа?

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

Отображение пользовательского типа записей с использованием шаблона архива по умолчанию

Для начала вы можете добавить главный раздел вашего нового типа записей для отображения в меню. Для этого перейти в админ-меню Внешний вид -> Меню и добавьте пользовательскую ссылку в выбранное меню. По этой ссылке будут доступны записи вашего типа.

http://site.ru/movies

Когда вы перейдете по этой ссылке, то увидите страницу архива со своим типом записей. Для этого система использует файл шаблона archive.php.

Отображение пользовательского типа записей с использованием своих шаблонов

Если вам не нравится внешний вид страницы архива для вашего пользовательского типа записей, то вы можете создать свой. Для этого нужно просто создать новый файл в каталоге вашей темы и назвать его archive-movies.php.

Для начала вы можете скопировать содержимое файла archive.php своей темы в archive-movies.php. Затем изменяйте его так как хотите. Теперь при переходе по адресу http://site.ru/movies система будет подставлять шаблон archive-movies.php.

Также вы можете также создать собственный шаблон для отображения одиночной записи вашего типа. Для этого вам нужно создать single-movies.php в каталоге вашей темы. Начните с того, что скопируйте в этот файл содержимое single.php вашей темы. Дальше изменяйте на свое усмотрение.

Отображение пользовательского типа записей на главной странице

Главное преимущество пользовательских типов записей – они защищены от обычных Записей и Страниц. Если все же их нужно отобразить на главной странице (http://site.ru), то для этого добавьте следующий код в файл functions.php вашей активной темы:

function wpschool_add_movies_to_query( $query ) {
    if ( is_home() && $query->is_main_query() )
        $query->set( 'post_type', array( 'post', 'movies' ) );
    return $query;
}
add_action( 'pre_get_posts', 'wpschool_add_movies_to_query' );

Отображение списка записей пользовательского типа

Для этого используется следующий код:

<?php
$args = array( 'post_type' => 'movies', 'posts_per_page' => 10 );
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<h2><?php the_title(); ?></h2>
<div class="entry-content">
<?php the_content(); ?>
</div>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<p><?php _e( 'Записи не найдены.' ); ?></p>
<?php endif; ?>

В этом коде сначала мы определили тип записей и количество постов на странице в аргументах для нашего нового класса WP_Query. После этого мы запустили запрос, получили записи и отобразили их внутри цикла WordPress.

Отображение пользовательских типов записей в виджетах

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

Для начала установите и активируйте бесплатный плагин Ultimate Posts Widget. После этого в админ-панели перейдите Внешний вид -> Виджеты и перетащите виджет Ultimate Posts на боковую панель.

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

Виджет Ultimate Posts

Курс WordPress-разработчик
Если Вам понравилась статья — поделитесь с друзьями
Михаил Петров
Привет! Меня зовут Михаил Петров. Я копирайтер и занимаюсь этим с 2013 года. Скрупулезность и ответственность - моя фишка! Не могу делать как попало и добиваюсь, чтоб заказчик сказал минимум “неплохо”. За все время своей работы пришлось написать и отредактировать немало разной “текстовухи”, включая SEO-тексты, отзывы и прочую чушь. На сегодняшний день специализируюсь на написании информационных статей и руководств технического направления. Вижу смысл и светлое будущее в текстах для людей, а не для машин.