Свои типы записей и таксономии
Записи и страницы — только два встроенных типа содержимого. Книги, товары, вакансии, отзывы, события удобнее хранить в собственных типах: у каждого свой раздел в панели, свои адреса и шаблоны.
Регистрация типа
// books.php (плагин)
add_action('init', function () {
register_post_type('book', [
'labels' => [
'name' => 'Книги',
'singular_name' => 'Книга',
'add_new_item' => 'Добавить книгу',
'edit_item' => 'Изменить книгу',
],
'public' => true,
'has_archive' => true,
'menu_icon' => 'dashicons-book',
'supports' => ['title', 'editor', 'thumbnail', 'excerpt'],
'rewrite' => ['slug' => 'books'],
'show_in_rest' => true,
]);
});В панели появится раздел «Книги», список книг откроется по адресу /books/, а отдельная книга — /books/название/.
Основные настройки
| Настройка | Значение |
|---|---|
public | Тип виден на сайте и в панели |
has_archive | Есть страница со списком |
supports | Какие поля есть в редакторе |
rewrite | Часть адреса |
menu_icon | Значок в меню панели |
show_in_rest | Доступен в REST API и блочном редакторе |
hierarchical | Записи могут быть вложены друг в друга, как страницы |
Своя таксономия
Таксономия — способ группировать записи. Рубрики и метки — встроенные таксономии; для книг заведём жанры:
add_action('init', function () {
register_taxonomy('genre', 'book', [
'labels' => [
'name' => 'Жанры',
'singular_name' => 'Жанр',
],
'public' => true,
'hierarchical' => true,
'rewrite' => ['slug' => 'genre'],
'show_in_rest' => true,
]);
});hierarchical: true делает таксономию похожей на рубрики — с вложенностью; false — на метки.
Шаблоны
По иерархии шаблонов для нового типа ищутся свои файлы:
| Файл | Для чего |
|---|---|
single-book.php | Страница одной книги |
archive-book.php | Список книг |
taxonomy-genre.php | Книги одного жанра |
<?php
// single-book.php
get_header();
while (have_posts()) :
the_post();
?>
<article class="book">
<h1><?php the_title(); ?></h1>
<?php the_post_thumbnail('large'); ?>
<p class="genres"><?php the_terms(get_the_ID(), 'genre', 'Жанр: ', ', '); ?></p>
<?php the_content(); ?>
</article>
<?php
endwhile;
get_footer();Тема или плагин
Типы записей регистрируют в плагине. Если объявить их в теме, после смены оформления раздел «Книги» исчезнет из панели, хотя сами записи останутся в базе.
Частая ошибка
Сразу после регистрации нового типа его страницы отдают ошибку 404: WordPress ещё не обновил правила адресов. Откройте «Настройки → Постоянные ссылки» и нажмите «Сохранить» — правила пересоберутся. В плагине это делают один раз при активации:
register_activation_hook(__FILE__, function () {
books_register_types();
flush_rewrite_rules();
});Вызывать flush_rewrite_rules() при каждой загрузке сайта нельзя: это медленная операция.