Из “коробки” вордпресс имеет 2 типа записей: посты и страницы. Не всегда этого достаточно… Расскажу, как добавить кастомный тип постов, таксономии к нему и метаданные. А также, создадим свои роли пользователей для операций с постами этого типа.
Содержание
- Регистрируем тип и таксономию
- Наполняем смыслами. Пункт админ-меню, форма создания/редактирования
- Дальнейшие настройки типов
- Настройки типа записей для фронта сайта
- Настройка кастомных таксономий
- Постмета
- Заключение
- Источники
Регистрируем тип и таксономию
Следуя традиции из кодекса вордпресс, зарегистрируем тип записи book и категории для нее book_cat. Для этого достаточно следующего кода
<?php add_action('init', 'register_post_types'); function register_post_types() { // регистрируем тип записи register_post_type('book'); // регистрируем таксономию для типа записи register_taxonomy('book_cat', 'book'); }
По-поводу регистрации первой функции – все ясно-понятно – аргумент это слаг типа постов; по второй функции – первый аргумент это слаг таксономии, второй – к какому типу записей ее прикрепить, если таких типов несколько – укажи массив всех. В документации сказано, что второй аргумент при регистрации таксономии – это экраны, где выводятся данные таксономии, но, по-моему, мое определение ближе к сути.
Итак, данным выше кодом мы зарегистрировали тип постов, но смысл?.. все, что он(код) делает – создает запись о том, что такой тип существует; единственное, что ты можешь с ним сделать – получить его в вызове функции get_post_types()(ну и, соответственно, для таксономии get_taxonomies()).
Наполняем смыслами. Пункт админ-меню, форма создания/редактирования
Смыслы в процессе регистрации как типов так и таксономий, создают второй и третий аргументы функций, соответственно.
Для начала, проявим эти пункты в меню администратора – для этого допишем наш код до следующего состояния
В таком виде будет выведен пункт меню верхнего уровня в админке. Если же ключу show_in_menu присвоить слаг существующей страницы, то пункт появится как дочерний. Дальше,
<?php add_action('init', 'register_post_types'); function register_post_types() { // массив для типа записей $typeArray = [ 'label' => 'Book', 'show_ui' => true, 'show_in_menu' => true ]; // массив для таксономий $taxArray = [ 'label' => 'Genres' ]; // регистрируем тип записи register_post_type('book', $typeArray); // регистрируем таксономию для типа записи register_taxonomy('book_cat', 'book', $taxArray); }
рассмотрим типы и таксономии отдельно…
Теперь о странице создания/редактировании поста. По умолчанию, будут доступны поля задания заголовка и поле редактора TinyMCE для контента. Чтобы добавить стандартные метабоксы, в массив $typeArray, в ключ supports впишите массив с идетификаторами всех необходимых меетабоксов: title, editor, author, thumbnail, excerpt, custom-fields, comments, revisions, page-attributes, post-formats. Для того, чтоб работал page-attributes нужно включить вложенность постов, т.е. hierarchical присвоить true.
С thumbnail и post-formats тоже есть своя особенность; их поддержку нужно включить следующим кодом
<?php add_action('after_setup_theme', 'book_support'); function book_support() { add_theme_support('post-thumbnails', ['book']); add_theme_support('post-formats', [ 'aside', 'gallery' ]); }
Еще, малость не забыл, все тексты в меню, форме постов и в фронте сайта задаются в массиве labels… ну, если дефолтные названия не нравятся.
Дальнейшие настройки типов
Следующее, что я предлагаю включить – так это отображение записей моего типа на странице создания меню. Чтоб это сделать, достаточно в массив $typeArray вписать ключ show_in_nav_menus со значением true.
Кстати, как ты видишь, наша таксономия Genres была туда добавлена сразу же, при ее регистрации.
Затем, предлагаю включить посты этого типа в WP REST API; для этого ключу show_in_rest также нужно присвоить значение true. Как ты заметишь, это действие, также, включит редактор Гутенберга. Сам слаг в АПИ будет равен слагу типа поста, однако, его можно изменить в параметре rest_base. По умолчанию, обслуживать АПИ-запросы к этим постам будет WP_REST_Posts_Controller, но параметром rest_controller_class можно изменить(прочти “WP REST API(дефолтное) — взаимодействие с WP сайтом“).
И, последнее, о настройках типов постов, связанное с админкой – установление прав на создание/редактирование постов. По умолчанию, права на сии действия ровны правам на эти действия с записями(post). Но также, при регистрации типа постов есть возможность задавать свои права на эти действия. Для установления своих прав в capability_type достаточно поставить массив из своих слагов(для единственного и множественного чисел – для примера – book books). При этом будут сгенерированы права: если map_meta_cap false(по умолчанию) то создадутся основные(publish_books, edit_books, edit_others_books и read_private_books), но если true – будут созданы и основные и метаправа(delete_published_books, edit_others_books и т.д.).
Также, массив прав можно задать иначе: capability_type поставить в false И в по ключу capabilities создать массив, в котором переназначить слаги существующим возможностям. И теперь, чтобы воспользоваться новыми правами, установим плагин редактирования ролей(к примеру, User Role Editor). С помощью этих плагинов обновим права администратора и создадим новую роль, которой присвоим права на этот тип записей(ну или дадим их существующей роли). Можно, конечно, сделать это кодом – но зачем, если это единоразовое редактирование настроек в таблице БД, после чего плагин следует выкинуть.
И последняя настройка в админке(если твой тип должен использовать дефолтные таксономии) – это ключу taxonomies передать массив со слагами таксономий.
Настройки типа записей для фронта сайта
Во фронте сайта настроек не так уж и много; прежде, чем что-то делать – нужно разрешить публичный доступ к этому типу: ключу publicly_queryable присвоить true. Второе – это конечно же – включение архива записей. Для этого ключу has_archive присваиваем true, после чего обычным циклом в шаблоне темы archive-book.php можно вывести все записи этого типа. Также, в этом параметре можно указать слаг для архива в место true, при этом шаблон отображения страницы тот же. Сами статьи можно просматривать уже после разрешения публичного доступа, который был дан ранее.
Третье – включим результаты поиска на сайте по статьям этого типа – присвоим exclude_from_search 0. Ну вот, пожалуй, все настройки типа записи.
Настройка кастомных таксономий
По аналогии с типом записей – рассмотрим админку, а потом фронт; в админке можно настроить иерархичность таксономии: ключ hierarchical в true(по умолчание) древовидность включена, false – выключена. Cледующее – настроить вид метабокса для отображения таксономии у ключа meta_box_cb назначить функцию отрисовки. Из коробки есть две такие post_categories_meta_box и post_tags_meta_box
После отображения в форме, будем настраивать отображение в админ-меню. Если тип записи в меню как отдельный пункт то таксономии отображаются как подпункты; их отображение можно скрыть поставив public false. Если же, тип записи, к которой принадлежит таксономия, отображается как подпункт в админ-меню – отобразить страницу таксономии настройкой массива не удастся.
Настройка WP REST API и настройка архивной страницы идентичны настройке в типах постов(вплоть до названия ключей).
Относительно прав для таксономий – их также можно настроить. По ключу capabilities задать массив из 4-ех значений:
'capabilities' => [ 'manage_terms' => 'manage_genres', 'edit_terms' => 'manage_genres', 'delete_terms' => 'manage_genres', 'assign_terms' => 'edit_books' ]
после этого, все новые роли нужно добавить в пул ролей с помощью тех же плагинов.
Постмета
Постмета и метадата – одно и тоже – то, что ты увидишь в метабоксе custom fields. Собственно, мету можно создавать и через него, но удобнее это делать через свои метабоксы.
Метабоксы можно создавать используя как плагин ACF(забивая на программирование) так и кодом. Рассмотрим их созданиие написание скрипта…
Для начала, зарегистрируем наш метабокс
<?php add_action('add_meta_boxes', 'book_site_metabox'); function book_site_metabox() { add_meta_box('book_url', 'Site', 'book_site_metabox_html', 'book'); } // рендеринг метабокса function book_site_metabox_html($post) { echo '<input type="url" name="site_url" value="' . esc_url(get_post_meta($post->ID, 'site_url', 1)) . '"/>'; wp_nonce_field('site_nonce', 'book_site'); }
таким образом, мы получим метабокс, однако, он не будет сохранять никакой информации. Чтобы это исправить, нужно создать функцию-обработчик:
<?php add_action('save_post_book', 'save_post_book'); function save_post_book($post_id) { if (isset($_POST['book_site']) && wp_verify_nonce($_POST['book_site'], 'site_nonce') && current_user_can('edit_books')) { update_post_meta($post_id, 'site_url', esc_url_raw($_POST['site_url'])); } }
Заключение
Рассмотрены основные настройки для создания кастомных типов постов. В процесе написания этой статьи был создан следующий, полностью рабочий, код
<?php // plugin name: book add_action('init', 'register_post_types'); function register_post_types() { // массив для типа записей $typeArray = [ 'label' => 'Book', 'show_ui' => true, 'show_in_menu' => 'index.php', 'show_in_nav_menus' => true, 'show_in_rest' => true, 'supports' => ['title','thumbnail','post-formats'], 'map_meta_cap' => true, 'capability_type' => 'book', 'has_archive' => 'books', 'publicly_queryable' => true, 'exclude_from_search' => 0 ]; // массив для таксономий $taxArray = [ 'label' => 'Genres', 'hierarchical' => false, 'meta_box_cb' => 'post_tags_meta_box', 'capabilities' => [ 'manage_terms' => 'manage_genres', 'edit_terms' => 'manage_genres', 'delete_terms' => 'manage_genres', 'assign_terms' => 'edit_books' ] ]; // регистрируем тип записи register_post_type('book', $typeArray); // регистрируем таксономию для типа записи register_taxonomy('book_cat', 'book', $taxArray); } add_action('after_setup_theme', 'book_support'); function book_support() { add_theme_support('post-thumbnails', ['book']); add_theme_support('post-formats', [ 'aside', 'gallery' ]); } add_action('add_meta_boxes', 'book_site_metabox'); function book_site_metabox() { add_meta_box('book_url', 'Site', 'book_site_metabox_html', 'book'); } function book_site_metabox_html($post) { echo '<input type="url" name="site_url" value="' . esc_url(get_post_meta($post->ID, 'site_url', 1)) . '"/>'; wp_nonce_field('site_nonce', 'book_site'); } add_action('save_post_book', 'save_post_book'); function save_post_book($post_id) { if (isset($_POST['book_site']) && wp_verify_nonce($_POST['book_site'], 'site_nonce') && current_user_can('edit_books')) { update_post_meta($post_id, 'site_url', esc_url_raw($_POST['site_url'])); } }
Не забудь создать необходимые права, прежде, чем опробовать. Также, тип записей можно создавать плагинами типа CPT UI.