Как добавить и вывести новые кастомные типы записей в WordPress.

Если вы хотя бы раз создавали сайт на WordPress, то вы точно работали с разными типами записей, такими как «Страницы» и «Записи». На практике, часто возникает потребность в создании кастомного типа записи для вывода определенного типа информации. Произвольные типы записей в WordPress служат для сегментации и удобной работы с различными форматами контента на сайте.

Давайте представим, что вы разрабатываете блог для книжного магазина, где одна из рубрик будет называться  «Обзоры книг». Чтобы не создавать отдельную категорию в общих записях движка, лучше всего создать отдельный тип записей, к которым в итоге вы сможете добавить произвольные поля и создать индивидуальный шаблон для вывода как основной, так и дополнительной информации вводимой при добавлении поста. В случае с книгами, к произвольным полям можно отнести: «жанр», «автор», «год выпуска», «тематика» и прочие. К тому же по итогу вы сможете делать сортировку по параметрам, но это тема другой статьи. Такой подход позволит вашему контент менеджеру удобно искать и добавлять новые обзоры, заполнять поля и в целом комфортно работать с таким типом контента.

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

Дефолтные типы постов в WordPress

По-умолчанию в WordPress есть несколько встроенных типов записей.

  • Страницы (page). Используются для создания различных страниц сайта с возможностью подключения разных шаблонов, сортировки по порядку, при включении постоянных ссылок урл страниц будет иметь вид: https://site.com/your-page. Также, страницы имеют функцию вложенности, а урл вложенных страниц содержит и родительский урл, что дает возможность формировать грамотную структуру сайта. По дефолту шаблон для страниц в теме это – page.php.
  • Записи (post). Стандартный тип поста, который используется для блога. Шаблон для вывода записи в теме — single.php.
  • Вложения (attachment). Сюда входя такие типы записей как изображения и файлы со своими параметрами, например, размер, title и другое.
  • Редакции (revision). Это черновики, которые формируются после того, как вы нажимаете кнопку «Сохранить» при редактировании записи. Они дают возможность восстановить сохраненную копию в различных временных интервалах.
  • Элементы меню (nav_menu_item). Тип записей, который сохраняет в себе информацию об элементах меню.

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

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

На практике можно использовать два подхода к добавлению новых типов постов на ваш сайт.

  1. С помощью установки плагинов.
  2. Вручную, путем использования функций движка.

Давайте разберем каждый из этих методик отдельно.

С использованием плагинов

Этот метод подойдет для тех, кто не хочет лезть в файлы темы, а настроить и добавить кастомный тип записи из админки WordPress. Наибольшую популярность среди вебмастеров для выполнения этой задачи получил плагин — Custom Post Type UI.

Для его установки переходим в раздел «Плагины» — «Добавить новый». В строке поиска ищем по названию плагина, жмем установить и активировать. После этого в сайдбаре появиться пункт меню «CPT UI».

Для создания нового типа записей переходим в раздел «CPT UI» — «Add/Edit Post Types».

В текстовом поле «Post Type Slug» указываем название, которое должно состоять из латинских букв и цифр. Конкретно в нашем примере мы укажем значение «books».

В поле «Plural Label» задаем название уже на русском языке во множественном числе, например «Книги».

В поле «Singular Label», указываем название в единственной форме, например «Книга».

Также, можно вставить описание, в поле «Post Type Description», но это не обязательное поле для ввода.

После ввода данных, нажимаем кнопку «Add Post Type». На этом все, ваш пользовательский тип записей создан.

Еще один момент, остальные поля во вкладке «Additional Labels» отвечают за вывод надписей при редактировании постов и рубрик этого типа записи в админке.

В репозитории WordPress есть и другие плагины, которые позволяют добавлять новые типы постов, например: WCK Custom Post Types and Custom Fields Creator, Pods, Custom Post Type Maker и другие.

Создание произвольного типа записей без использования плагинов

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

Код для добавления пользовательского типа записей нужно размещать в файле functions.php вашей темы на WordPress. Можно напрямую вставить код внизу файла, либо же подключить туда файл, например, из папки inc, это уже как вам удобно.

За определение нового типа записей отвечает функция register_post_type(). В нее передают два основных параметра: название и массив $args, в котором задают основные настройки для custom post type.

Итак, сделав бекап файла functions.php, добавьте в него следующий код.

function webpro_create_books_posttype() {
    register_post_type( 'books',
        array(
            'labels' => array(
            'name' => __( 'Книги' ),
            'singular_name' => __( 'Книга' )
        ),
        'public' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'book'),
        )
    );
}
add_action( 'init', 'webpro_create_books_posttype' );

Это базовое подключение типа записей с минимальным количеством опций.

Обязательно добавляйте префиксы к названиям функций.

Важный момент касательно названия custom post type, не используйте следующие имена: post, page, attachment, revision, nav_menu_item, action, order, theme. Эти слова зарезервированы движком и если вы будете добавлять код с именем из этого списка, ничего работать не будет.

Ниже приведен пример кода с расширенными настройками.

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

    $args = array(
        'label' => __( 'movies' ),
        'description' => __( 'Каталог обзоров на книги' ),
        'labels' => $labels,
        'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'custom-fields', ),
        'has_archive' => true,
        'taxonomies' => array( 'your_taxonomy' ),
        '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( 'books', $args );

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

В массиве $args используются следующие опции.

  • labels – массив array, который содержит текстовые переменные для вывода информации в админке WordPress, при редактировании пользовательского типа записей. Например, вместо «Добавить новую», вы можете указать «Добавить новую книгу».
  • description – короткое описание, которое четко описывает какой тип постов в ней размещать.
  • public – видно ли тип записи для авторов и посетителей, значение по умолчанию FALSE, что означает, что он не появляется даже в панели администратора.
  • exclude_from_search – определяет, будут ли записи данного типа исключены из поиска на сайте.
  • publicly_queryable – можно ли получить запись этого типа с помощью URL-адреса, например, https://www.site.com ?post_type={post_type_key}, или в расширенном использовании через функцию query_posts(). Значение по умолчанию true.
  • show_ui – подключаются ли ссылки меню и редактор сообщений в панели управления администратора. Значение по умолчанию – екгу;
  • show_in_nav_menus – будут ли записи этого типа добавляться в меню навигации, созданные на странице Внешний вид ->Меню, значение по умолчанию – true.
  • show_in_menu – отображается ли ссылка типа записи в навигации административной панели. FALSE – скрывает ссылку. TRUE – добавляет ссылку как новую ссылку верхнего уровня. Ввод строки позволяет разместить ссылку внутри существующей ссылки верхнего уровня, то есть ввести параметры options-general.php располагает её под ссылкой Настройки.
  • show_in_admin_bar – сделать этот тип доступным из админ бара.
  • hierarchical – может ли запись быть назначена к родительской записи, если значение TRUE, то массив $supports должен содержать параметр «page-attributes»
  • supports – выборочно включает функции записи такие как: изображения, фрагменты текста, произвольные поля и др. Если вместо массива указать false, то никакие вспомогательные поля выведены не будут, в том числе и по умолчанию.
  • taxonomies – массив таксономий, который может быть применён к публикациям этого типа, таксономии должны быть уже зарегистрированными – отсюда они не создаются!
  • has_archive – включить поддержку страниц архивов для этого типа записей (например, url записи выглядит так: site.com/type/post_name, тогда url архива будет такой: site.ru/type).   
  • query_var  – TRUE или FALSE определяет, может ли запись быть доступна по url: /?{query_var_string}={post_slug}.
  • menu_position. Позиция, где должно расположиться меню нового типа записи в числовом эквиваленте. Например, 4-9 — под меню «Записи», 20-24 — под меню «Страницы», или же 80-99 — под меню «Параметры».
  • can_export. Добавляет возможность экспорта этого типа записей.
  • Строка, которая будет маркером для установки прав для этого типа записи. Встроенные маркеры это: post и page.

Полный список опций вы можете посмотреть на странице WordPress Codex для функции: register_post_type().

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

Мы уже разобрались, как добавлять и работать с кастомными типами записей в админке, теперь давайте рассмотрим способы вывода этих записей на фронтенде.

Как вывести свой тип постов на главной странице сайта

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

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

В этом коде $query->set() принимает два параметра:

  • приоритет, который нужно изменить, в данном примере post_type.
  • массив, который  нужно передать как значение для post_type. Как видите в коде указано значение для массива «post», если вам нужно вывести только ваш тип записей, то «post» можно удалить.

В примере мы сделали вывод стандартных постов и записей типа books. Название типа записей стоит указывать то же, что вы задавали при регистрации кастомного типа.

Цикл для вывода своих типов постов в любом месте сайта

Для этих целей используется класс WP_Query и цикл WordPress.

<?php
$args = array( 'post_type' => 'books', '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; ?>

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

Вывод постов из custom post type в виджете

В WordPress есть стандартный виджет, который позволяет выводить записи, но в нем отсутствует функционал по выбору нужного нам типа записей. В качестве альтернативы вы можете установить и активировать плагин – «Ultimate Posts Widget». Далее перейти в меню «Внешний вид» — «Виджеты» и перетащить в область виджета блок «Ultimate Posts».

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

Выводим записи с помощью стандартного меню движка

Для этого переходим в раздел админки «Внешний вид» — «Меню». Слева выберите пункт меню «Произвольные ссылки» и укажите название меню, например «Обзоры книг» и slug, который вы задавали при регистрации типа записи, в наше случае это «books», например http://site.com/books.

Тут же вы можете вывести отдельную запись из своего кастомного типа постов, выбрав вкладку «Книги».

Шаблон для списка постов произвольного типа записи WordPress

Перейдя в раздел /books, вы увидите список постов, а для их вывода WordPress использует шаблон archive.php. Для того, чтобы изменить этот шаблон на свой и сделать другую верстку страниц или же добавить дополнительную информацию к карточкам книг нужно в папке темы создать файл — archive-books.php. Вместо books вы указываете slug своего типа записей. После этого копируете содержимое archive.php в файл archive-books.php и далее уже редактируете шаблон под свои задачи.

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

Как привязать произвольные поля?

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

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

 Для того чтобы их вывести на сайте используется следующий код.

<?php
// Generates all custom fields attached to the post in a <ul> list
the_meta();
// Get a specific piece of information
echo get_post_meta( $post->ID, 'Жанр', TRUE );
?>

Тут два примера. Первый  использованием функции the_meta(). Которая выведет все указанные для поста произвольные поля в списке ul. Второй get_post_meta() – получает значения, и при необходимости может вывести отдельный тип поля.

Обычно при выводе конкретного поля проверяют, существует ли оно, и только потом выводят его значения. Пример кода ниже.

<?php
    $book_genre = get_post_meta( $post->ID, 'Жанр', TRUE );
    if (!empty($book_genre)) { ?>
      <div class="book-genre">
        <?php echo $book_genre ?>
      </div>
<? } ?>

Удобнее для этих целей использовать плагин — Advanced Custom Fields. Он в свою очередь позволяет работать с редактором Gutenberg, что также немаловажно.

Устанавливаете и активируете плагин. Переходите в меню «Группы полей» — «Добавить». Заполняете и добавляете свои поля к группе.

Выводить поля можно с помощью конструкций.

// Display field value
the_field( 'FIELD NAME' );

// Return field value
get_field( 'FIELD NAME' );

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

Подключаем Gutenberg к пользовательским типам записей

С версии WordPress 5.0 запущен новый визуальный редактор Gutenberg. Но создавая вручную новый тип кастомных записей при редактировании их, вы будете видеть старый редактор — Classic Editor.

Чтобы подключить Gutenberg вам, при создании кастомного типа постов стоит прописать новый параметр.

'show_in_rest' => true,
'supports' => array('editor')

После чего можно идти в админку и проверять изменения.

Пример кода с включением редактора Gutenberg.

function webpro_create_books_posttype() {
    register_post_type( 'books',
        array(
            'labels' => array(
            'name' => __( 'Книги' ),
            'singular_name' => __( 'Книга' )
        ),
        'public' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'book'),
        'show_in_rest' => true,
        'supports' => array('editor')
        )
    );
}
add_action( 'init', 'webpro_create_books_posttype' );

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

Поделиться в социальных сетях:
Нет комментариев к данной статье

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *