Custom Post Type (CPT): Пользовательский тип записи в WordPress

Владислав Белецкий
Владислав Белецкий .
Категория:
Комментариев: 0

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:



    В отличие от метавозможностей, примитивные возможности не проверяются относительно конкретной записи:



    Возможности, которые могут быть назначены для вашего кастомного типа записи, следующие:

    • 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: Ограничение новых ревизий записей WordPress

После применения Кода №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, чтобы ото­бражать ваши данные не так как ваши публикации в блоге.

Чтобы использовать собственный файл архива, вы должны установить аргумент has_archive при регистрации своего пользовательского типа записи в значение true. Аргумент has_archive является частью функции register_post_type().

В целом, для отображения страницы пользовательского типа записи («book») и архива, WP будет искать шаблоны в теме по такой иерархии:

  1. single-{post_type}.php | archive-{post_type}.php
  2. single.php | archive.php
  3. index.php

Плагины для пользовательских типов записей

Для регистрации различных кастомных типов записей можно использовать один из лучших плагинов — Custom Post Type UI (WebDevStudios).

Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии