Создаем свой тип записи. Метадата, роли пользователей, таксономии

Из «коробки» вордпресс имеет 2 типа записей: посты и страницы. Не всегда этого достаточно… Расскажу, как добавить кастомный тип постов, таксономии к нему и метаданные. А также, создадим свои роли пользователей для операций с постами этого типа.

Содержание

Регистрируем тип и таксономию

Следуя традиции из кодекса вордпресс, зарегистрируем тип записи book и категории для нее book_cat. Для этого достаточно следующего кода

<?php add_action('init', 'register_post_types'); function register_post_types() { // регистрируем тип записи register_post_type('book'); // регистрируем таксономию для типа записи register_taxonomy('book_cat', 'book'); }
Code language: HTML, XML (xml)

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

Итак, данным выше кодом мы зарегистрировали тип постов, но смысл?.. все, что он(код) делает — создает запись о том, что такой тип существует; единственное, что ты можешь с ним сделать — получить его в вызове функции 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); }
Code language: HTML, XML (xml)
вид в меню админки при разных show_in_menu
1 — show_in_menu => ‘index.php’; 2 — show_in_menu => true

рассмотрим типы и таксономии отдельно…

Теперь о странице создания/редактировании поста. По умолчанию, будут доступны поля задания заголовка и поле редактора 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' ]); }
Code language: HTML, XML (xml)

Еще, малость не забыл, все тексты в меню, форме постов и в фронте сайта задаются в массиве labels… ну, если дефолтные названия не нравятся.

Дальнейшие настройки типов

Следующее, что я предлагаю включить — так это отображение записей моего типа на странице создания меню. Чтоб это сделать, достаточно в массив $typeArray вписать ключ show_in_nav_menus со значением true.

book nav menu

Кстати, как ты видишь, наша таксономия 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 

1 — meta_box_cb => ‘post_categories_meta_box ‘; 2 — meta_box_cb => ‘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' ]
Code language: PHP (php)

после этого, все новые роли нужно добавить в пул ролей с помощью тех же плагинов.

Постмета

Постмета и метадата — одно и тоже — то, что ты увидишь в метабоксе 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'); }
Code language: HTML, XML (xml)

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

<?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'])); } }
Code language: HTML, XML (xml)

Заключение

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

<?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'])); } }
Code language: HTML, XML (xml)

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

Источники

Добавить комментарий

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

*

code