Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Свои типы записей и таксономии

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

Регистрация типа

// 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() при каждой загрузке сайта нельзя: это медленная операция.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.