В первых четырёх статьях мы добавляли данные книги к обычной записи WordPress. Для одной демонстрации этого достаточно, но в настоящем каталоге смешивать книги и новости неудобно: у них разные поля, списки и правила оформления. Решение — создать отдельный тип записей «Книги», а затем показать группе ACF только редактору книг.

Когда нужен отдельный тип записей

Тип записи — это отдельный вид контента со своим списком в панели WordPress. Встроенные примеры — записи и страницы. Пользовательский тип, например book, добавляет раздел «Книги», но продолжает пользоваться знакомыми заголовками, редактором, статусами публикации и REST API.

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

Регистрируем тип записей

Для небольшого сайта положите код в собственный плагин проекта. Тогда тип «Книги» останется доступен, даже если поменять тему. Создайте PHP-файл плагина и зарегистрируйте тип на событии init:

<?php
add_action( 'init', 'codelab_register_book_post_type' );

function codelab_register_book_post_type() {
    register_post_type( 'book', array(
        'labels' => array(
            'name'          => 'Книги',
            'singular_name' => 'Книга',
            'add_new_item'  => 'Добавить книгу',
            'edit_item'     => 'Редактировать книгу',
        ),
        'public'       => true,
        'has_archive'  => true,
        'rewrite'      => array( 'slug' => 'books' ),
        'show_in_rest' => true,
        'supports'     => array( 'title', 'editor', 'thumbnail' ),
    ) );
}

book — внутренний ключ типа, а books — часть публичного адреса. supports включает стандартные элементы редактора. show_in_rest нужен, чтобы тип был доступен редактору блоков и REST API WordPress.

После активации плагина один раз откройте Настройки → Постоянные ссылки и нажмите «Сохранить». WordPress обновит правила адресов. Не вызывайте flush_rewrite_rules() на каждой загрузке страницы: это дорогая операция, которую выполняют при активации плагина или при разовой настройке.

Показываем группе ACF нужный экран

Откройте группу полей «Данные книги» и поменяйте правило показа с «Тип записи равно Запись» на «Тип записи равно Книга». Если группа зарегистрирована кодом, измените поле value в разделе location на book:

'location' => array(
    array(
        array(
            'param'    => 'post_type',
            'operator' => '==',
            'value'    => 'book',
        ),
    ),
),

Создайте книгу в новом разделе. На её экране должны быть обычное поле содержимого и ваши поля ACF, а в обычной записи — только стандартные поля. Одно правило размещает одну группу полей на подходящем типе контента.

Если пункт «Книги» не появился

  • Проверьте, что плагин активирован и код не содержит синтаксической ошибки.
  • Убедитесь, что ключ типа состоит из допустимых символов и короче 20 знаков.
  • Обновите постоянные ссылки после добавления нового типа.
  • Проверьте show_in_rest, если используете редактор блоков.
  • Сверьте location.value в группе ACF с ключом типа book.

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

Документация

Продолжение мини-курса

  1. Предыдущая часть: собираем карточку книги.
  2. Списки глав через Repeater.
  3. Переносим группы полей через Local JSON.
  4. Ищем книги по полям ACF.