CPT (custom post type) — пользовательский тип записи (кастомный тип записи), то, что действительно делает WordPress системой управления контеном. С их помощью вы можете быстро создавать пользовательские функции и хранить данные в согласованном порядке.
Содержание
Типы записей по умолчанию
При установке WordPress по умолчанию уже есть несколько типов записей: страницы, посты и др. Все эти значения типов записей хранятся в таблице базы данных (БД) wp_posts
и подразделяются согласно данным в поле post_type
.
Страницы WordPress — это статические страницы контента, такие как домашняя страница, страница «о сайте», контактная информация, биография или любая другая пользовательская страница, которую вы хотите создать. Страницы могут быть неограниченно вложены в любую иерархическую структуру. Они также могут быть отсортированы по значению поля menu_order.
Публикация (запись, пост, сообщение) — это ваш блог или новости, сюда входит весь ваш контент, который индексируется поисковыми системами Интернета. Вы можете классифицировать свои посты (по Категориям), помечать их ключевыми словами (тегами), устанавливать даты публикации и многое другое. В общем, публикации отображаются в виде списка в обратном хронологическом порядке на веб-интерфейсе вашего сайта.
Вложение. Каждый раз, когда вы загружаете изображение или файл в публикацию, WordPress сохраняет этот файл не только на сервере, но и как публикацию в таблице wp_posts с значением attachment в поле post_type.
Редакции. WordPress сохраняет все посты в качестве редакций каждый раз после их редактирования. Эта функция включена по умолчанию, и вы можете обратиться к истории редакций, чтобы вернуть содержимое к предыдущему состоянию.
Элемент меню навигации. Каждый раз, когда вы создаете пользовательское меню с помощью основного редактора меню WordPress (wp-admin — appearance — menus), сохраняются записи с информацией для ваших меню.
Пользовательский CSS. Объект Customizer имеет настройку ”Дополнительный CSS”. Этот код CSS хранится в настраиваемой записи типа custom_css. Дополнительный CSS специфичен для активной темы, и у каждой темы будет отдельная запись custom_css для хранения CSS. Вы можете представить себе сайт с множеством пользовательских настроек CSS. Параметры иногда автоматически загружаются или кэшируются, и эти системы могут замедлиться или даже “зависнуть” при большом количестве CSS.
Наборы изменений похожи на версии публикации, но для ваших настроек, а не для постов. При редактировании настроек в настройщике эти изменения сохраняются в записи типа customize_changeset. Если вы случайно закрыли вкладку браузера и вернулись в настройщик, то WordPress предложит вам восстановить эти изменения с помощью набора изменений.
Кэш oEmbed. WordPress позволяет встраивать контент от поддерживаемых провайдеров oEmbed, помещая URL-адрес контента в отдельной строке в редакторе сообщений. Если вы поместите URL-адрес видео с YouTube в отдельной строке, то WP обнаружит, что указан URL-адрес Youtube.com, а затем обратится по соответствующему URL-адресу oEmbed, чтобы вставить проигрыватель YouTube в публикацию в веб-интерфейсе сайта. Код для вставки из этого запроса кэшируется в пользовательской записи типа oembed_cache и устанавливается как дочерний элемент поста, который вы редактировали.
Пользовательские запросы. Начиная с WordPress 4.9, администраторы могут управлять экспортом личных данных или их удалением от имени пользователей. Вкладку, где можно управлять экспортом и удалением пользовательских данных можно найти в меню Tools (Инструменты) на панели администрирования. Эти запросы хранятся в пользовательской записи типа user_request.
Повторно используемые блоки. Одна из особенностей нового редактора на основе блоков, представленного в WordPress 5.0,— возможность сохранять блоки, которые вы настраиваете в записи, как ’’повторно используемый блок”. Такие блоки хранятся в пользовательском типе посте wp_block.
Определение и регистрация CPT
Как и стандартные типы записей WordPress, вы можете формировать свои собственные CPT для управления любыми данными, которые вам нужны, в зависимости от того, что вы создаете. Каждый CPT на самом деле просто пост, используемый по-другому. Вы можете зарегистрировать CPT для меню ужина в ресторане, для автомобилей от автодилера, для отслеживания информации о пациенте и документах в кабинете врача, или для почти всего, что только можно представить. В самом деле, любой тип контента, который вы способны придумать, может быть сохранен как пост с вложенными файлами, пользовательскими метаданными и пользовательскими таксономиями.
В нашем примере это будет книжный сайт, где в постах по умолчанию будут публиковаться новости, а нам нужно создать CPT для управления книгами. В этом типе записи будут использоваться и пользовательские метаполя. Мы можем хранить эту информацию так же, как обрабатываются посты, и отображать их для конечного пользователя в теме, используя тот же цикл wp_query, что и с постами.
Функция register_post_type($post_type, $args)
Функция register_post_type() регистрирует новый пользовательский тип записи. В большинстве случаев CPT регистрируется в файле functions.php
темы или в файле пользовательского плагина. Эта функция принимает два параметра — имя создаваемого вами поста и массив аргументов:
$post_type — название вашего CPT (в нашем примере имя CPT — «book»). Эта строка не должна содержать более 20 символов и не может включать заглавные буквы, пробелы или специальные символы, кроме дефиса или нижнего подчеркивания. Если вы создаете плагин для публичного распространения, то можете использовать префикс в имени вашего CPT (например myplugin_book), чтобы избежать конфликтов, на случай если какой-нибудь другой плагин имеет такое же имя;
$args — это массив множества различных аргументов, которые определят настройку CPT.
Вот список всех доступных аргументов ($args) и их назначение для CPT:
- label — отображаемое имя вашего типа сообщения. В нашем примере — «Книга».
- labels — необязательный массив меток, который можно использовать для описания типа сообщения в пользовательском интерфейсе:
- name — отображаемое имя вашего типа сообщения во множественном числе. Это переопределит аргумент label;
- singular_name — название для любого конкретного поста в единственном числе. По умолчанию задано name, если другое не указано;
- add_new — по умолчанию задана строка Add New (Добавить новый);
- add_new_item — по умолчанию Add New Post (Добавить новое сообщение);
- edit_item — по умолчанию Edit Post (Редактировать пост);
- new_item — по умолчанию New Post (Новая запись);
- view_item — по умолчанию View Post (Просмотреть запись);
- search_terns — по умолчанию Search Posts (Поиск по записям);
- not_found — по умолчанию No Posts Found (Записи не найдены);
- not_found_in_trash — по умолчанию No Posts Found in Trash (Записи в удаленных не найдены);
- parent_item_colon — по умолчанию Parent Page (Родительская страница) и используется только для иерархических типов записей;
- all_items — по умолчанию All Posts (Все записи).
- menu_name — название меню для типа сообщения, обычно такое же, как label или labels->name.
- description — необязательная строка, описывающая тип вашей записи.
- publicly_queryable — необязательный аргумент логического типа (Boolean), который указывает, могут ли запросы по вашему типу записи выполняться в вебинтерфейсе или теме вашего приложения. По умолчанию включен.
- exclude_from_search — необязательный аргумент логического типа (Boolean), который указывает, могут ли ваши типы записей запрашиваться и отображаться в результатах поиска WordPress по умолчанию. Эта функция отключена по умолчанию, поэтому ваши записи будут доступны для поиска.
- capability_type — необязательная строка или массив. Если не указано иное, то по умолчанию будет post. Вы можете передать строку существующего типа записи, и новый тип записи, который вы регистрируете, унаследует возможности этого типа записи. Вы также можете определить свой собственный тип возможностей, который будет устанавливать возможности CPT по умолчанию для чтения, публикации, редактирования и удаления. Вы также можете передать массив, если хотите использовать разные слова в единственном и множественном числе. Например, вы можете передать массив «book», «books»).
- capabilities — необязательный массив возможностей типа записи, которую вы регистрируете. Этот аргумент вы можете указать вместо option_type, если хотите получить более детальный контроль над возможностями, которые вы назначаете для своего нового CPT. Существует два типа возможностей: мета и примитив. Метавозможности привязаны к конкретным постам, тогда как примитивные возможности имеют более общее назначение. На практике это означает, что при проверке, имеет ли пользователь метавозможности, нужно передать параметр $post_id:
12345678// Мета возможности связаны с конкретными постамиif ( current_user_can( “edit_post”, $post_id ) ) {// текущий пользователь может редактировать сообщение с ID = $post_id}
В отличие от метавозможностей, примитивные возможности не проверяются относительно конкретной записи:12345678// примитивные возможности не связаны с конкретными постамиif ( current_user_can(“edit_posts”) ) {// текущий пользователь может редактировать публикации в целом}
Возможности, которые могут быть назначены для вашего кастомного типа записи, следующие:- edit_post — метавозможность пользователя редактировать определенный пост.
- read_post — метавозможность пользователя открыть определенный пост.
- delete_post — метавозможность пользователя удалить определенный пост.
- edit_posts — примитивная возможность пользователя создавать и редактировать публикации.
- edit_others_posts — примитивная возможность пользователя создавать и редактировать чужие публикации.
- publish_posts — примитивная возможность пользователя публиковать посты.
- read_private_posts — примитивная возможность пользователя видеть личные посты.
- read — примитивная возможность пользователя видеть посты.
- delete_posts — примитивная возможность пользователя удалять посты.
- delete_private_posts — примитивная возможность пользователя удалять личные посты.
- delete_published_posts — примитивная возможность пользователя удалять посты.
- delete_others_posts — примитивная возможность пользователя удалять чужие посты.
- edit_private_posts — примитивная возможность пользователя редактировать личные посты.
- edit_published_posts — примитивная возможность пользователя публиковать посты.
- map_meta_cap — задействовать ли внутреннюю обработку метаданных по умолчанию. По умолчанию false. Вы всегда можете определить свои собственные возможности через capabilities, но если вы этого не сделаете, то установка map_meta_cap в значение true приведет к активизации следующих примитивных возможностей: capability_type: read, delete_posts, delete_private_posts, delete_published_posts, delete_others_posts, edit_private_posts и edit_published_posts.
- hierarchical — необязательный логический тип, который указывает, может ли публикация быть иерархической и иметь родительский пост. Страницы WordPress настроены так, что вы можете вкладывать одни страницы в другие. Аргумент hierarchical по умолчанию отключен.
- public — необязательный аргумент логического типа (Boolean), который указывает, должен ли тип публикации применяться публично или нет в бэкенде или веб-интерфейсе WordPress. По умолчанию — false; поэтому без включения этого аргумента и установки его в true вы не сможете использовать этот post_type в своей теме. Если для public установлено значение true, то exclude_from_search, publicly_queryable и show_ui_nav_menus автоматически устанавливаются в true, если не указано иное. Большинство CPT будут общедоступными, поэтому они отображаются на веб-интерфейсе или доступны через панель управления WordPress. Другие CPT (например, CPT Revisions по умолчанию) обновляются «за кулисами», основываясь на других взаимодействиях с вашим приложением, и в них для public будет установлено значение false.
- rewrite — необязательный логический тип или массив, предназначенный для создания пользовательской структуры постоянной ссылки (permalink) для типа записей. По умолчанию это значение равно true, а структура постоянной ссылки для пользовательского сообщения —
/post_type/post_title/
. Если установлено значение false, пользовательская постоянная ссылка не будет создана. Вы можете полностью настроить структуру постоянных ссылок сообщения, передав массив со следующими аргументами:- slug — по умолчанию используется post_type, но может быть любая строка, которую вы зададите. Помните, что один и тот же slug не может быть в нескольких типах записей, потому что они должны быть уникальными;
- with_front — нужно ли добавлять «префикс» к передней части постоянной ссылки CPT. Если задано значение true, слаг для любой страницы, установленный на странице Settings — Reading панели мониторинга, будет добавлен в постоянную ссылку для записей этого типа;
- feeds — логическое значение, указывающее, может ли тип записи иметь канал RSS. По умолчанию принимает значение аргумента has_archive. Если для feeds задано значение false, каналы не будут доступны;
- pages — логическое значение, которое включает нумерацию страниц для типа записей. Если true, страницы архива для этого типа поста будут поддерживать разбиение на страницы;
- ep_mask — ЕР или endpoints (конечные точки) могут быть очень полезны. С помощью этого аргумента вы назначаете маску конечной точки для типа сообщения. Например, мы могли бы установить конечную точку для книги, которая называется ”pop-quiz” (викторина). Постоянная ссылка будет выглядеть как /book/post-title/pop-quiz/. В терминологии MVC CPT похож на модуль, и конечные точки могут рассматриваться как различные представления для этого модуля. (Мы рассмотрим конечные точки и другие функции перезаписи в главе 7.)
- has_archive — необязательный логический аргумент или строка, указывающая, может ли тип записи иметь страницу архива. По умолчанию — false, вы можете установить значение true, если хотите использовать его в своей теме. Файл archive-<post_type>.php в вашей теме будет служить для отображения страницы архива. Если этот файл недоступен, вместо него будет задействован файл archive.php или index.php.
- query_var — необязательный логический аргумент или строка, задающая ключ query_var для типа записи. Это имя вашего типа записи в базе данных и применяется при написании запросов для работы с этим типом записи. По умолчанию принимает значение аргумента post_type. В большинстве случаев вам не нужно, чтобы ваш query_var и ваш post_type были разными, но вы можете представить длинное имя типа записи, например «directory_entry», для которого вы хотели бы задать более короткий фрагмент, такой как «dir».
- supports — необязательный логический аргумент или массив, который указывает, какие функции метаполей будут доступны для новой публикации или странице редактирования сообщения. По умолчанию передается массив с аргументами заголовок и редактор. Далее приведен список всех доступных аргументов (чтобы использовать одну из этих функций с вашим CPT, убедитесь, что она включена в массиве supports):
- title;
- editor;
- comments;
- revisions;
- trackbacks;
- author;
- excerpt;
- page-attributes;
- thumbnail;
- custom-fields;
- post-formats.
- register_meta_box_cb — необязательная строка, которая позволяет вам предоставить пользовательскую функцию обратного вызова для интеграции ваших собственных пользовательских метаполей.
- permalink_epmask — необязательная строка для указания того, какие типы конечных точек вы хотите связать с пользовательским типом записи. Маской перезаписи конечной точки по умолчанию является EP_PERMA LINK.
- taxonomies — необязательный массив, который задает произвольные встроенные (категории и теги) или пользовательские таксономии, которые вы хотите связать с типом записи. По умолчанию ссылки на таксономии отсутствуют. Подробнее о таксономиях см. разд. «Создание пользовательских таксономий».
- show_ui — необязательный аргумент типа Boolean, который указывает, будет ли доступен базовый пользовательский интерфейс публикации для нового типа записи в бэкенде. По умолчанию принимает значение аргумента public. Если show_ui имеет значение false, то вы не сможете заполнять свои посты из области администрирования бэкенда.
- menu_position — необязательный целочисленный аргумент, который определяет положение типа записи в меню, которое слева. Список наиболее часто используемых положений, где разместить пункт меню для пользовательской записи:
- По умолчанию — под Комментариями;
- 5: под публикациями;
- 10: под медиа;
- 15: под ссылками;
- 20: под страницами;
- 25: под комментариями;
- 60: под первым разделителем;
- 65: под плагинами;
- 70: под пользователями;
- 75: под инструментами;
- 80: под настройками;
- 100: под вторым разделителем.
- menu_icon — необязательная строка URL-адреса для пользовательского значка, которая может представлять тип записи.
- can_export — необязательный аргумент типа Boolean, указывающий, можно ли экспортировать тип записи через экспортер WP в меню Tools — Export (Инструменты — Экспорт). Этот аргумент по умолчанию имеет значение true, что позволяет администратору экспортировать.
- show_in_nav_menus — необязательный аргумент типа Boolean, который указывает, можно ли добавлять сообщения данного типа записи в пользовательское меню навигации в разделе Appearance — Menus (Внешний вид — Меню). По умолчанию принимает значение аргумента public.
- show_in_menu — необязательный аргумент типа Boolean или строка, указывающая, отображать ли тип записи в административном меню и, возможно, где его показывать. Если установлено значение true, тип записи отображается в меню как отдельный элемент. Если установлено false, пункт меню для данного типа записи не отображается. Вы также можете передать строку имени любого другого пункта меню. При этом тип записи помещается в подменю переданного пункта меню. По умолчанию принимает значение аргумента show_ui.
- show_in_admin_bar — необязательный аргумент типа Boolean, который указывает, доступен ли тип записи в панели администратора WordPress. По умолчанию принимает значение аргумента show_in_menu.
- delete_with_user — необязательный аргумент типа Boolean, который указывает, следует ли удалять все сообщения для типа записи, созданного данным пользователем. Если установлено значение true, то сообщения, созданные пользователем, будут перемещены в корзину при удалении пользователя. Если установлено значение false, то сообщения не будут перемещаться в корзину при удалении пользователя. По умолчанию сообщения перемещаются в корзину, если в аргументе post_type_supports указан автор. Если нет, то сообщения не перемещаются в корзину.
- show_in_rest — необязательный аргумент типа Boolean, который указывает, доступен ли этот CPT через REST API. Значение по умолчанию — false.
- rest_base — необязательная строка для изменения базового слага, используемая при доступе к CPT этого типа через REST API. Значением по умолчанию для этого аргумента является имя типа записи, заданное в качестве первого параметра функции register_post_type().
- rest_controller_class — необязательная строка для изменения контроллера при доступе к этому типу записи через REST API. Этот аргумент должен иметь значение wp_REST_Posts_Controiier или имя класса РНР, который наследует класс WP_REST_Posts_Controller. Значение по умолчанию — WP_REST_Posts_Controller.
- _builtin — этот аргумент вам не потребуется изменять. Он по умолчанию задан для типов сообщений WordPress, чтобы отличать их от CPT.
- _edit_link — URL-адрес ссылки для редактирования записи. Это также для внутреннего использования, и вам не нужно его менять. Если вы хотите изменить страницу, на которую указывает ссылка, чтобы отредактировать запись, используйте фильтр get_edit_post_link, который передает ссылку для редактирования по умолчанию вместе с идентификатором записи.
Код №1 иллюстрирует регистрацию нового CPT «Книги» с помощью функции register_post_type(), код которой можно найти в файле wp-includes/post.php
. Обратите внимание, что в нашем примере мы используем только несколько из множества доступных аргументов.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
// Пользовательская функция для регистрации типа записи “book”
function add_register_post_type_books() {
register_post_type(‘book’, array(
‘labels’ => array(
‘name’ => __ (‘Книги’),
‘singular_name’ => __(‘Книга’)
),
‘public’ => true,
‘has_archive’ => true,
)
);
}
// Вызываем нашу пользовательскую функцию с помощью хука init
add_action(‘init’, ‘add_register_post_type_books);
|
После применения Кода №1 в файле functions.php
активной темы или активного плагина, то в панели администрирования под пунктом меню «Comments» появится пункт меню «Книги».
Шаблоны вывода страницы и архива CPT
Большинство тем WordPress имеют файл archive.php
, который отображает ваши сообщения на странице archive/listing, и файл single.php
, который отвечает за отображение информации в одной записи. Вы можете легко создать общий архив и отдельные файлы для ваших зарегистрированных CPT. Сделайте копию archive.php и назовите ее archive-book.php
. Теперь вы должны автоматически получить страницу со списком всех ваших домашних заданий в том же формате, что и обычная страница архива сообщений (по адресу mysite.com/book/).
Тот же метод работает и с файлом single.php
. Скопируйте его и назовите single-book.php
. В результате у вас должна быть отдельная страница для каждого домашнего задания (по адресу mysite.com/book/book-123/
). Теперь вы можете изменить разметку архива СРТ или файла single.php, чтобы отображать ваши данные не так как ваши публикации в блоге.
В целом, для отображения страницы пользовательского типа записи («book») и архива, WP будет искать шаблоны в теме по такой иерархии:
- single-{post_type}.php | archive-{post_type}.php
- single.php | archive.php
- index.php
Плагины для пользовательских типов записей
Для регистрации различных кастомных типов записей можно использовать один из лучших плагинов — Custom Post Type UI (WebDevStudios).