Register_post_type() — позволяет зарегистрировать новый тип поста. Все о пользовательских типах записей WordPress Пример регистрации типа поста

Возвращает существующие (зарегистрированные) типы записей. Можно фильтровать вывод по множеству критериев.

✈ 1 раз = 0.000001с = скорость света | 50000 раз = 0.14с = очень быстро | PHP 7.1.11, WP 4.9.8

Хуков нет.

Возвращает

Массив. Список названий типов записей или массив объектов (вывод настраивается в параметре $output).

Использование

get_post_types($args, $output, $operator); $args(массив) name => page label => Страницы labels => stdClass Object() description => public => 1 hierarchical => 1 exclude_from_search => publicly_queryable => show_ui => 1 show_in_menu => 1 show_in_nav_menus => 1 show_in_admin_bar => 1 menu_position => 20 menu_icon => capability_type => page map_meta_cap => 1 register_meta_box_cb => taxonomies => Array() has_archive => query_var => can_export => 1 delete_with_user => 1 _builtin => 1 _edit_link => post.php?post=%d cap => stdClass Object(edit_post => edit_page read_post => read_page delete_post => delete_page edit_posts => edit_pages edit_others_posts => edit_others_pages publish_posts => publish_pages read_private_posts => read_private_pages read => read delete_posts => delete_pages delete_private_posts => delete_private_pages delete_published_posts => delete_published_pages delete_others_posts => delete_others_pages edit_private_posts => edit_private_pages edit_published_posts => edit_published_pages create_posts => edit_pages) rewrite => show_in_rest => 1 rest_base => pages rest_controller_class => WP_REST_Posts_Controller
  • label
  • singular_label
  • description
  • public - Логический, если true, то выбраны будут только публичные типы записей (см. описание register_post_type()).
  • publicly_queryable
  • exclude_from_search
  • show_ui
  • capability_type
  • edit_cap
  • edit_type_cap
  • edit_others_cap
  • publish_others_cap
  • read_cap
  • delete_cap
  • hierarchical
  • supports
  • register_meta_box_cb
  • taxonomies
  • menu_position
  • menu_icon
  • permalink_epmask
  • rewrite
  • query_var
  • Builtin
    Логический. Если true, то будут возвращены встроенные типы записей WP: page, posts... false - вернет только новые типы записей.

    Типы записей относящиеся к критерию _builtin:

    • mediapage
    • attachment
    • revision
    • nav_menu_item - с версии 3.0
    • custom post type - с версии 3.0
  • _edit_link

По умолчанию: предустановки

$output(строка)

Как выводить результат. Возможны 2 варианта:

  • names - будет возвращен массив имен;
  • objects - будет возвращен массив объектов с данными типа записи.
    По умолчанию: "names"
$operator(строка) Оператор сравнения для указанных критериев. Может быть: "and" и "or".
По умолчанию: "and"

Примеры

#1 Выведем на экран список названий всех зарегистрированных типов записей

Выведет зарегистрированные типы записей:

$post_types = get_post_types(); /* $post_types = Array ( => post => page => attachment => revision => nav_menu_item => article => question) */ foreach($post_types as $post_type) { echo $post_type ."\n"; } /* Выведет: post page attachment revision nav_menu_item article func */

#2 Выведем на экран список типов записей имеющих страницу во форонте

$post_types = get_post_types([ "publicly_queryable"=>1 ]); $post_types["page"] = "page"; // встроенный тип не имеет publicly_queryable unset($post_types["attachment"]); // удалим attachment /* Array => post => custom_type1 => custom_type2 => custom_type3 => page */

#3 Выведем на экран список всех публичных, произвольных (созданных) типов записей

$args = array("public" => true, "_builtin" => false); $output = "names"; // names or objects, note names is the default $operator = "and"; // "and" or "or" $post_types = get_post_types($args, $output, $operator); foreach ($post_types as $post_type) { echo "

". $post_type. "

"; }

#4. Пример, получение типа записи по названию

Здесь используется вывод в виде объекта данных (object). Выводим тип записи с названием property:

$post_types = get_post_types([ "name"=>"property" ], "objects"); foreach ($post_types as $post_type) { echo "

Нашей статьи, посвященной созданию и использованию собственных типов записей, мы охватили суть пользовательских собственных типов записей в Wordpress, а также постарались начать работать над созданием собственных типов. Мы также осветили способы сохранения модульности за счет использования отдельного PHP-файла, что позволяет нам переносить типы записей от шаблона к шаблону.

Сегодня же мы хотим рассказать вам о процессе создания таксономии для собственных типов постов, а также о создании собственных полей и мета-блоков, о сохранении данных и использовании их в собственных шаблонах для Wordpress.

Давайте приступим!

Создание таксономии (для возможности сортировки по категории)

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

Для этого мы будем использовать Wordpress-функцию . Как вы можете видеть ниже и в codex.wordpress.org, аргументы, которые она принимает, это taxonomy, за которым следует тип объекта и, наконец, $args. Для нашего примера мы создали 2 таксономии – Skills и Club Level. Мы применяем таксономии к типу записей athlete, а затем задаем аргументы, включая ярлыки и переписываем привилегии. Давайте взглянем на код.

Register_taxonomy("Sport", array("athlete"), array("hierarchical" => true, "label" => "Sport", "singular_label" => "Sport", "rewrite" => true));
register_taxonomy("Club Level", array("athlete"), array("hierarchical" => true, "label" => "Club Level", "singular_label" => "Club Level", "rewrite" => true));
Зарегистрированные таксономии выглядят примерно следующим образом.

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

Закончили уже?

Хм, в целом, у вас уже есть собственный тип записи, который функционирует. Но на данный момент он ничем не отличается от обычных записей. Давайте окунемся в создание собственных полей для ваших записей, которые позволят вам указывать уникальную информацию, а затем отображать её в шаблонах.

Создание собственных полей

Для того чтобы начать творить настоящее волшебство с помощью собственных типов записей, для начала вам нужно будет инициализировать функцию для возможности добавлять мета-блоки. Нашу мы назовем admin_init(), и выглядеть она будет следующим образом:

Add_action("admin_init", "admin_init");

function admin_init(){
add_meta_box("personal_info", "Personal Info", "personal_info", "athlete", "normal", "low");
}
Первая часть нашего кода инициализирует функцию admin_init(). Понятно, что вторая часть данного кода представляет собой саму функцию. В целом, этот код сообщает вашему шаблону о необходимости создать новый мета-блок под названием «Personal Info», поместить его в тип записи athlete и затем дать ему низкий приоритет (расположение в типе записи).

Круто! Ну а теперь мы закончили?

Нет еще. Но уже совсем близко! Давайте добавим еще несколько собственных полей. Это больше относится к HTML, нежели к PHP.

Создание полей в собственных мета-блоках

А теперь начинается самое интересное. Мы собираемся создать мета-блок с личными данными (мы его уже сделали выше, а сейчас собираемся заполнить его), который будет спрашивать имя и фамилию человека, пол, адрес электронной почты, номер телефона и дату рождения.

Для того чтобы сделать это, мы создаем функцию под названием personal_info(). Та же функция, которую мы вызывали в функции admin_init(). А теперь, включаем свет? Все линии сходятся.

Доброго времени суток, дорогие хабравчане, я уже много лет делаю сайты на wordpress и решил поделится своим опытом. Мне сильно порадовала новость ранее опубликованная aleksandrit , о том что "WordPress используется уже на более чем 50 миллионах сайтов ", это новость вдохновляет все больше изучать глубокие и скрытые возможности Wordpress. Ранее подобная тема уже была опубликована bRuz ом но я бы хотел подойти к вопросу иначе, шаг за шагом.

И так начнем с очевидного.

Зачем нужны custum post type

Главная цель custum post type позволить разработчику организовать данные на сайте. например: если речь идет о блоге, то у нас есть несколько типов данных(записи, медиафайлы, страницы и ссылки). Но что делать тем у кого сайт посвящен? новинкам кино индустрии? подобному сайту понадобится такой тип записей как «Обзор», у обзора должны быть такие характеристики как: жанр, год выпуска, обложка, актеры и т.д… Использования custum post type в отличие от обычных записей, дает нам возможность использовать эти данные в шаблоне, а так же искать по определенным параметрам и сортировать.

Начнем создавать

Для того чтоб создать новый тип записи нам понадобится редактировать файл functions.php который находится в директории используемого шаблона.

Function create_post_type() { // создаем новый тип записи

array(
"labels" => array(
"name" => __("Обзоры"), // даем названия разделу, для панели управления
"singular_name" => __("Обзор") // даем названия одной записи
),
"public" => true,
"menu_position" =>
"rewrite" => array("slug" => "reviews") // указываем slug для ссылок например: http://mysite/reviews/
);
}

И так что получилось,
Обратите внимания на то что в левой панели появилась вкладка обзоры.

Как мы видим на этой картинке у нас появились пару проблем. заголовок все еще остался таким «Добавить запись» и нету возможности добавить обложку. Попробуем это исправить, для этого нам понадобится добавить пару параметров (полный список параметров ищите в кодексе).
function create_post_type() { // создаем новый тип записи
register_post_type("reviews", // указываем названия типа
array(
"labels" => array(
"name" => __("Обзоры"), // даем названия разделу для панели управления
"singular_name" => __("Обзор"), // даем названия одной записи
"add_new" => _x("Добавить новый"),// далее полная русификация админ. панели
"add_new_item" => __("Добавить новый обзор"),
"edit_item" => __("Редактировать обзор"),
"new_item" => __("Новый обзор"),
"all_items" => __("Все обзоры"),
"view_item" => __("Просмотр обзора"),
"search_items" => __("Поиск обзора"),
"not_found" => __("Нет обзоров"),
"not_found_in_trash" => __("обзоры не найдены"),
"menu_name" => "Обзоры"

),
"public" => true,
"menu_position" => 5, // указываем место в левой баковой панели
"rewrite" => array("slug" => "reviews"), // указываем slug для ссылок например: http://mysite/reviews/
"supports" => array("title", "editor", "thumbnail", "revisions") // тут мы активируем поддержку миниатюр
);
}

Add_action("init", "create_post_type"); // инициируем добавления типа

Результат:

И так, теперь мы полностью исправили русификацию и сделали возможным прикрепления миниатюр к нашему новому типу записи. теперь мы можем создать шаблон который будит показывать наши записи.

Loop

Если честно, мне приходят в голову два способа отображения нового типа записи. и так примеры:
Первый способ: использовать шаблонный файл, допустим тип новой записи называется "reviews", в этом слачае мы создаем файл под названием archive-reviews.php для отображения множество записей и single-reviews.php для отображения одной записи (оффтоп. приятный пример иерархии всех шаблонов прекрасно отображён на данной инфограме) далее мы используем простой код итерации по записям:
стандартная итерация по массиву
the_title();// заголовок

echo "";
the_content();// запись
echo "";
endwhile;

Второй способ: вызов лупа из любой части шаблона,
$args = array("post_type" => "reviews", "posts_per_page" => 10);//тут мы указываем на тип записи по которой желаем пройтись и количество записей на одной странице
$loop = new WP_Query($args);// получаем результат запроса в переменное loop
while ($loop->have_posts()) : $loop->the_post(); // далее стандартная итерация по массиву
the_title();// заголовок
php the_post_thumbnail(array(150,150)); //получаем миниатюру записи
echo "";
the_content();// запись
echo "";
endwhile;

Надеюсь вам понравилось и статья была полезной, все же первый пост. с появлением столь простого инструмента, wordpress стал полноценным cms хотя все еще позиционирует себя как блог.

В следующий раз я хотел бы раскрыть такую прекрасную функцию как Taxonomies и custom fields

Теги: wordpress, cms, разработка сайтов, wordpress 3.3

Создает новый тип записи или изменяет имеющийся.

С версии 4.6 был создан новый класс WP_Post_Type и весь код функции теперь обрабатывается этим классом, а эта функция стала оберткой для него.

Таксономии

Если для нового типа записи регистрируется таксономия, то всегда регистрируйте эту таксономию при регистрации типа записи, для этого используя параметр taxonomies . Если вы этого не сделаете, тип поста и таксономии не будут опознаны как связанные при срабатывании хуков, таких как: parse_query или pre_get_posts . Это может привести к неожиданным последствиям и ошибкам.

Таксономии нужно регистрировать отдельно. Таксономия указывается при регистрации типа записи, однако это только связь, регистрировать её нужно отдельно, с помощью register_taxonomy() .

Важно: после создания нового типа записи. Обязательно нужно зайти на страницу Настройки → Постоянные ссылки. Нужно это для того, чтобы правила ЧПУ были пересозданы и туда были добавлены правила нового типа записи.

Возвращает

WP_Post_Type объект (с версии 4.6).

Шаблон для создания нового типа записи
add_action("init", "register_post_types"); function register_post_types(){ register_post_type("post_type_name", array("label" => null, "labels" => array("name" => "____", // основное название для типа записи "singular_name" => "____", // название для одной записи этого типа "add_new" => "Добавить ____", // для добавления новой записи "add_new_item" => "Добавление ____", // заголовка у вновь создаваемой записи в админ-панели. "edit_item" => "Редактирование ____", // для редактирования типа записи "new_item" => "Новое ____", // текст новой записи "view_item" => "Смотреть ____", // для просмотра записи этого типа. "search_items" => "Искать ____", // для поиска по этим типам записи "not_found" => "Не найдено", // если в результате поиска ничего не было найдено "not_found_in_trash" => "Не найдено в корзине", // если не было найдено в корзине "parent_item_colon" => "", // для родителей (у древовидных типов) "menu_name" => "____", // название меню), "description" => "", "public" => true, // "publicly_queryable" => null, // зависит от public // "exclude_from_search" => null, // зависит от public // "show_ui" => null, // зависит от public // "show_in_nav_menus" => null, // зависит от public "show_in_menu" => null, // показывать ли в меню адмнки // "show_in_admin_bar" => null, // зависит от show_in_menu "show_in_rest" => null, // добавить в REST API. C WP 4.7 "rest_base" => null, // $post_type. C WP 4.7 "menu_position" => null, "menu_icon" => null, //"capability_type" => "post", //"capabilities" => "post", // массив дополнительных прав для этого типа записи //"map_meta_cap" => null, // Ставим true чтобы включить дефолтный обработчик специальных прав "hierarchical" => false, "supports" => [ "title", "editor" ], // "title","editor","author","thumbnail","excerpt","trackbacks","custom-fields","comments","revisions","page-attributes","post-formats" "taxonomies" => , "has_archive" => false, "rewrite" => true, "query_var" => true,)); }

Использование

register_post_type($post_type, $args); $post_type(строка) (обязательный)

Название типа записи (максимум 20 символов). Может содержать только строчные символы, числа, _ или - : a-z0-9_- .

Зарезервированные названия для типов постов . Нельзя использовать следующие названия для новых типов постов, так как они используются WordPress и ваш код будет конфликтовать с текущим кодом или функциями WordPress:

Post page attachment revision nav_menu_item custom_css customize_changeset action author order theme $args(массив) Массив аргументов.
По умолчанию: array() (параметры по умолчанию)

Аргументы параметра $args

label(строка) Имя типа записи помеченное для перевода на другой язык.
По умолчанию: $post_type labels(массив)

Для неустановленных строк (т.е. по умолчанию), будут использованы:

  • Для не древовидных типов записей - названия "постов".
  • Для древовидных типов записей - названия "постоянных страниц".

В массиве можно указать следующие аргументы:

"name" => "", // основное название для типа записи, обычно во множественном числе. "singular_name" => "", // название для одной записи этого типа. "add_new" => "", // текст для добавления новой записи, как "добавить новый" у постов в админ-панели. // Если нужно использовать перевод названия, вписывайте подобным образом: _x("Add New", "product"); "add_new_item" => "", // текст заголовка у вновь создаваемой записи в админ-панели. Как "Добавить новый пост" у постов. "edit_item" => "", // текст для редактирования типа записи. По умолчанию: редактировать пост/редактировать страницу. "new_item" => "", // текст новой записи. По умолчанию: "Новый пост" "view_item" => "", // текст для просмотра записи этого типа. По умолчанию: "Посмотреть пост"/"Посмотреть страницу". "search_items" => "", // текст для поиска по этим типам записи. По умолчанию "Найти пост"/"найти страницу". "not_found" => "", // текст, если в результате поиска ничего не было найдено. // По умолчанию: "Постов не было найдено"/"Страниц не было найдено". "not_found_in_trash" => "", // текст, если не было найдено в корзине. По умолчанию "Постов не было найдено в корзине"/"Страниц // не было найдено в корзине". "parent_item_colon" => "", // текст для родительских типов. Этот параметр не используется для не древовидных типов записей. // По умолчанию "Родительская страница". "all_items" => "", // Все записи. По умолчанию равен menu_name "archives" => "", // Архивы записей. По умолчанию равен all_items "insert_into_item" => "", // Вставить в запись "uploaded_to_this_item" => "", // Загружено для этой записи "featured_image" => "", // Миниатюра записи "set_featured_image" => "", // Установить миниатюру записи "remove_featured_image" => "", // Удалить миниатюру записи "use_featured_image" => "", // Использовать как миниатюру записи "filter_items_list" => "", // Фильтровать список записей "items_list_navigation" => "", // Навигация по записям "items_list" => "", // Список записей "menu_name" => "", // Название меню. По умолчанию равен name. "name_admin_bar" => "", // Название в админ баре (тулбаре). По умолчанию равен singular_name. "view_items" => "", // Название в тулбаре, для страницы архива типа записей. По умолчанию: «View Posts» / «View Pages». С WP 4.7. "attributes" => "", // Название для метабокса атрибутов записи (у страниц это метабокс «Свойства страницы» - «Page Attributes»). // По умолчанию: «Post Attributes» или «Page Attributes». С WP 4.7. "item_updated" => "", // Текст заметки в редакторе записи при обновлении записи. С WP 5.0. // По умолчанию: «Post updated.» / «Page updated.» "item_published" => "", // Текст заметки в редакторе записи при публикации записи. С WP 5.0. // По умолчанию: «Post published.» / «Page published.» "item_published_privately" => "", // Текст заметки в редакторе записи при публикации private записи. С WP 5.0. // По умолчанию: «Post published privately.» / «Page published "item_reverted_to_draft" => "", // Текст заметки в редакторе записи при возврате записи в draft. С WP 5.0. // По умолчанию: «Post reverted to draft.» / «Page reverted to "item_scheduled" => "", // Текст заметки в редакторе записи при запланированной публикации на будущую дату. С WP 5.0. // По умолчанию: «Post scheduled.» / «Page scheduled.»

Для полного списка значений см. get_post_type_labels()

По умолчанию: если не установлено, name и singular_name примят значение аргумента label

Description(строка) Короткое описание этого типа записи. Значение используется в REST API. Значение можно получить с помощью функции get_the_post_type_description() .
По умолчанию: "" public(логический)

Определяет является ли тип записи публичным или нет. На основе этого параметра строятся много других, т.е. это своего рода пред-установка для следующих параметров:

    • show_ui = false - не показывать пользовательский интерфейс (UI) для этого типа записей
    • publicly_queryable = false - запросы относящиеся к этому типу записей не будут работать в шаблоне
    • exclude_from_search = true - этот тип записей не будет учитываться при поиске по сайту
    • show_in_nav_menus = false - этот тип записей будет спрятан из выбора меню навигации
  • true
    • show_ui = true
    • publicly_queryable = true
    • exclude_from_search = false
    • show_in_nav_menus = true
  • title - блок заголовка;
  • editor - блок для ввода контента;
  • author - блок выбора автора;
  • thumbnail блок выбора миниатюры записи. Нужно также включить поддержку в установке темы post-thumbnails ;
  • excerpt - блок ввода цитаты;
  • trackbacks - включает поддержку трекбеков и пингов (за блоки не отвечает);
  • custom-fields - блок установки произвольных полей;
  • comments - блок комментариев (обсуждение);
  • revisions - блок ревизий (не отображается пока нет ревизий);
  • page-attributes - блок атрибутов постоянных страниц (шаблон и древовидная связь записей, древовидность должна быть включена).
  • post-formats – блок форматов записи, если они включены в теме.

По умолчанию: array("title","editor")

Register_meta_box_cb(строка) callback функция, которая будет срабатывать при установки мета блоков для страницы создания/редактирования этого типа записи. Используйте remove_meta_box() и add_meta_box() в callback функции.
По умолчанию: нет taxonomies(массив)

Массив зарегистрированных таксономий, которые будут связаны с этим типом записей, например: category или post_tag .

Связать таксономии с записью можно позднее через функцию register_taxonomy_for_object_type() .

Таксономии нужно регистрировать с помощью функции register_taxonomy() .

Этот параметр позволяет указать, какую группу конечных точек мы хотим подключить к создаваемому типу записи (к URL записи). Например, если указать "permalink_epmask" = EP_PAGES & EP_TAGS , то наш тип записи будет иметь все дополнительные варианты URL (конечные точки), которые предусмотрены для постоянных страниц и меток.

По умолчанию permalink_epmask = EP_PERMALINK - это означает, что в URL создаваемого типа записи (в правила ЧПУ) будут добавлены конечные точки, которые добавляются к обычным записям WordPress: пагинация, страница комментов и т.д.

Если не нужно добавлять никаких конечных точек к новому типу записи, то нужно указать EP_NONE . Или наоборот, указываем EP_ALL , когда нужно добавить все конечные точки.

По умолчанию: EP_PERMALINK

Has_archive(строка/логический)

Включить поддержку страниц архивов для этого типа записей (пр. УРЛ записи выглядит так: site.ru/type/post_name , тогда УРЛ архива будет такой: site.ru/type .

Если указать строку, то она будет использована в ЧПУ. Например, укажем тут typepage и получим ссылку на архив типа записи такого вида: site.ru/typepage .
Файл этого архива в теме будет иметь вид archive-type.php . Для архивов будет добавлено новое правило ЧПУ, если аргумент rewrite включен.
По умолчанию: false

Rewrite(массив/логический)

Использовать ли ЧПУ для этого типа записи. Чтобы не использовать ЧПУ укажите false. По умолчанию: true - название типа записи используется как префикс в ссылке. Можно в массиве указать дополнительные параметры для построения ЧПУ:

    slug (строка)
    Префикс в ЧПУ (/префикс/ярлык_записи). Используйте array("slug" => $slug) , чтобы создать другой префикс.
    В этом параметре можно указывать плейсхолдеры типа %category% . Но их нужно создать с помощью add_rewrite_tag() и научить WP их понимать.
    По умолчанию: название типа записи

    with_front (логический)
    Нужно ли в начало вставлять общий префикс из настроек. Префикс берется из $wp_rewite->front . Например, если структура постоянных ссылок записей в настройках имеет вид blog/%postname% , то при false получим: /news/название_поста, а при true получим: /blog/news/название_поста.
    По умолчанию: true

    feeds (логический)
    Добавить ли правило ЧПУ для RSS ленты этого типа записи.
    По умолчанию: значение аргумента has_archive

  • pages (логический)
    Добавить ли правило ЧПУ для пагинации архива записей этого типа. Пр: /post_type/page/2 .
    По умолчанию: true

По умолчанию: true (тип записи используется как префикс)

Query_var(строка/логический)

Устанавливает название параметра запроса для создаваемого типа записи.

Ставим false, чтобы убрать возможность запросов.

  • false - отключает параметр запроса. Запись не будет доступна по URL: /?{query_var}={post_slug} .
  • string - указывает название параметра зпроса. /?{query_var_string}={post_slug} .

Заметка: query_var не имеет смысла, если параметр publicly_queryable = false .

Заметка: Этот параметр добавляет указанное значение (если не указано, то ярлык типа записи) в список разрешенных параметров WordPress, чтобы WordPress понимал этот параметр запроса, см. add_rewrite_tag() . WordPress удаляет любые параметры запроса, о которых он не знает.

Пример:
Допустим мы регаем тип записи book и указали в этом параметре строку bookname . Теперь, пройде на страницу книги по ссылке /book/harry-potter , в коде обрабатывающем эту страницу get_query_var("bookname") вернет harry-potter . А если бы мы ничего не указали в этом параметре (он был бы true), то чтобы получить harry-potter , нам нужно было бы использовать get_query_var("book") .

По умолчанию: true - устанавливается аргумент $post_type

Can_export(логический) Возможность экспорта этого типа записей.
По умолчанию: true delete_with_user(логический)

  • true - удалять записи этого типа принадлежащие пользователю при удалении пользователя. Если включена корзина, записи не удаляться, а поместятся в корзину.
  • false - при удалении пользователя его записи этого типа никак не будут обрабатываться.
  • null - записи удаляться или будут перемещены в корзину, если post_type_supports("author") установлена. И не обработаются, если поддержки "author" у типа записи нет.
// $tax_slug = get_term_parents_list($term_id, $tax_name, array("separator" => "/", "format" => "slug", "link" => false, "inclusive" => true,));

Также важно, чтобы при реге типа записи, параметр hierarchical был false !

#3 Добавление таксономии в ЧПУ (у записи и таксы одинаковый префикс)

Этот пример показывает как создать запись типа Вопросы и разделы для нее. При этом ЧПУ будут:

  • У записи: site.ru/faq/{категория}/{ярлык-записи}
  • У таксы: site.ru/faq/{категория}

Тут важно сначала регнуть таксу, а потом тип записи...

Add_action("init", "register_faq_post_type"); function register_faq_post_type() { // Раздел вопроса - faqcat register_taxonomy("faqcat", array("faq"), array("label" => "Раздел вопроса", // определяется параметром $labels->name "labels" => array("name" => "Разделы вопросов", "singular_name" => "Раздел вопроса", "search_items" => "Искать Раздел вопроса", "all_items" => "Все Разделы вопросов", "parent_item" => "Родит. раздел вопроса", "parent_item_colon" => "Родит. раздел вопроса:", "edit_item" => "Ред. Раздел вопроса", "update_item" => "Обновить Раздел вопроса", "add_new_item" => "Добавить Раздел вопроса", "new_item_name" => "Новый Раздел вопроса", "menu_name" => "Раздел вопроса",), "description" => "Рубрики для раздела вопросов", // описание таксономии "public" => true, "show_in_nav_menus" => false, // равен аргументу public "show_ui" => true, // равен аргументу public "show_tagcloud" => false, // равен аргументу show_ui "hierarchical" => true, "rewrite" => array("slug"=>"faq", "hierarchical"=>false, "with_front"=>false, "feed"=>false), "show_admin_column" => true, // Позволить или нет авто-создание колонки таксономии в таблице ассоциированного типа записи. (с версии 3.5))); // тип записи - вопросы - faq register_post_type("faq", array("label" => "Вопросы", "labels" => array("name" => "Вопросы", "singular_name" => "Вопрос", "menu_name" => "Архив вопросов", "all_items" => "Все вопросы", "add_new" => "Добавить вопрос", "add_new_item" => "Добавить новый вопрос", "edit" => "Редактировать", "edit_item" => "Редактировать вопрос", "new_item" => "Новый вопрос",), "description" => "", "public" => true, "publicly_queryable" => true, "show_ui" => true, "show_in_rest" => false, "rest_base" => "", "show_in_menu" => true, "exclude_from_search" => false, "capability_type" => "post", "map_meta_cap" => true, "hierarchical" => false, "rewrite" => array("slug"=>"faq/%faqcat%", "with_front"=>false, "pages"=>false, "feeds"=>false, "feed"=>false), "has_archive" => "faq", "query_var" => true, "supports" => array("title", "editor"), "taxonomies" => array("faqcat"),)); } ## Отфильтруем ЧПУ произвольного типа // фильтр: apply_filters("post_type_link", $post_link, $post, $leavename, $sample); add_filter("post_type_link", "faq_permalink", 1, 2); function faq_permalink($permalink, $post){ // выходим если это не наш тип записи: без холдера %products% if(strpos($permalink, "%faqcat%") === false) return $permalink; // Получаем элементы таксы $terms = get_the_terms($post, "faqcat"); // если есть элемент заменим холдер if(! is_wp_error($terms) && !empty($terms) && is_object($terms)) $term_slug = array_pop($terms)->slug; // элемента нет, а должен быть... else $term_slug = "no-faqcat"; return str_replace("%faqcat%", $term_slug, $permalink); }

Заметки

Плагин для реги типа записи

Есть удобный плагин, который позволяет регистрировать новые типы записей (постов) и новые таксономии: Custom Post Type UI

Переименование заголовков типа записи

Если тип записи уже зарегистрирован, но нам нужно назвать его как-то иначе, используйте следующий код.

Этот код показывает, как переименовать стандартный тип записи "Записи" в "Статьи":

## заменим слово «записи» на «статьи» //$labels = apply_filters("post_type_labels_{$post_type}", $labels); add_filter("post_type_labels_post", "rename_posts_labels"); function rename_posts_labels($labels){ // заменять автоматически не пойдет например заменили: Запись = Статья, а в тесте получится так "Просмотреть статья" /* оригинал stdClass Object ("name" => "Записи", "singular_name" => "Запись", "add_new" => "Добавить новую", "add_new_item" => "Добавить запись", "edit_item" => "Редактировать запись", "new_item" => "Новая запись", "view_item" => "Просмотреть запись", "search_items" => "Поиск записей", "not_found" => "Записей не найдено.", "not_found_in_trash" => "Записей в корзине не найдено.", "parent_item_colon" => "", "all_items" => "Все записи", "archives" => "Архивы записей", "insert_into_item" => "Вставить в запись", "uploaded_to_this_item" => "Загруженные для этой записи", "featured_image" => "Миниатюра записи", "set_featured_image" => "Задать миниатюру", "remove_featured_image" => "Удалить миниатюру", "use_featured_image" => "Использовать как миниатюру", "filter_items_list" => "Фильтровать список записей", "items_list_navigation" => "Навигация по списку записей", "items_list" => "Список записей", "menu_name" => "Записи", "name_admin_bar" => "Запись",) */ $new = array("name" => "Статьи", "singular_name" => "Статья", "add_new" => "Добавить статью", "add_new_item" => "Добавить статью", "edit_item" => "Редактировать статью", "new_item" => "Новая статья", "view_item" => "Просмотреть статью", "search_items" => "Поиск статей", "not_found" => "Статей не найдено.", "not_found_in_trash" => "Статей в корзине не найдено.", "parent_item_colon" => "", "all_items" => "Все статьи", "archives" => "Архивы статей", "insert_into_item" => "Вставить в статью", "uploaded_to_this_item" => "Загруженные для этой статьи", "featured_image" => "Миниатюра статьи", "filter_items_list" => "Фильтровать список статей", "items_list_navigation" => "Навигация по списку статей", "items_list" => "Список статей", "menu_name" => "Статьи", "name_admin_bar" => "Статью", // пункте "добавить"); return (object) array_merge((array) $labels, $new); }

Очень дешевые, но качественные подписчики в Инстаграме доступны по адресу https://doctorsmm.com/ . Тут Вы сможете найти любое предложение персонально для Вашего аккаунта. На сайте представлено широкое разнообразие качества добавляемых страниц и скоростной режим, а также действует таргетирование аудитории по географическому признаку.

Заметки

  • Global. Массив. $wp_post_types List of post types.

Список изменений

С версии 2.9.0 Введена.
С версии 3.0.0 The show_ui argument is now enforced on the new post screen.
С версии 4.4.0 The show_ui argument is now enforced on the post type listing screen and post editing screen.
С версии 4.6.0 Post type object returned is now an instance of WP_Post_Type .
С версии 4.7.0 Introduced show_in_rest , rest_base and rest_controller_class arguments to register the post type in REST API.

Код register post type : wp-includes/post.php WP 5.2.3

20) { _doing_it_wrong(__FUNCTION__, __("Post type names must be between 1 and 20 characters in length."), "4.2.0"); return new WP_Error("post_type_length_invalid", __("Post type names must be between 1 and 20 characters in length.")); } $post_type_object = new WP_Post_Type($post_type, $args); $post_type_object->add_supports(); $post_type_object->add_rewrite_rules(); $post_type_object->register_meta_boxes(); $wp_post_types[ $post_type ] = $post_type_object; $post_type_object->add_hooks(); $post_type_object->register_taxonomies(); /** * Fires after a post type is registered. * * @since 3.3.0 * @since 4.6.0 Converted the `$post_type` parameter to accept a `WP_Post_Type` object. * * @param string $post_type Post type. * @param WP_Post_Type $post_type_object Arguments used to register the post type. */ do_action("registered_post_type", $post_type, $post_type_object); return $post_type_object; }

Создаем кастомный тип записи (Custom Post Type) Articles с кастомными категориями (Custom Taxonomy) Articles Category .

В моем случае все стандартные записи – это Товары, поэтому Статьи выведем через кастомные записи.

В файле функций functions.php регистрируем кастомный тип записи Articles:

Function wptp_create_post_type() { $labels = array("name" => __("Articles"), "singular_name" => __("Articles"), "add_new" => __("New Article"), "add_new_item" => __("Add New Article"), "edit_item" => __("Edit Article"), "new_item" => __("New Article"), "view_item" => __("View Article"), "search_items" => __("Search Articles"), "not_found" => __("No Articles Found"), "not_found_in_trash" => __("No Articles found in Trash"),); $args = array("labels" => $labels, "has_archive" => true, "public" => true, "hierarchical" => false, "menu_position" => 5, "supports" => array("title", "editor", "excerpt", "custom-fields", "thumbnail"),); register_post_type("articles", $args); } add_action("init", "wptp_create_post_type");

Если вы хотите, чтобы в кастомных постах выводились стандартные категории, тогда привяжите их к таксономии Категорий:

"taxonomies" => array("category"),

Если для кастомных постов вы создаете еще и кастомные таксономии, то связывать их надо с созданными таксономиями, если брать пример ниже, то это будут articles_category

"taxonomies" => array("articles_category"),

Затем для кастомного типа записи Articles регистрируем таксономии ‘Article Category’, чтобы разные записи могли принадлежать разным категориям.

Function wptp_register_taxonomy() { register_taxonomy("articles_category", "articles", array("labels" => array("name" => "Article Categories", "singular_name" => "Article Category", "search_items" => "Search Article Categories", "all_items" => "All Article Categories", "edit_item" => "Edit Article Categories", "update_item" => "Update Article Category", "add_new_item" => "Add New Article Category", "new_item_name" => "New Article Category Name", "menu_name" => "Article Category",), "hierarchical" => true, "sort" => true, "args" => array("orderby" => "term_order"), "show_admin_column" => true)); } add_action("init", "wptp_register_taxonomy");

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

"rewrite" => array("slug" => "blog"),

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

Больше примеров можно найти и . Но привести весь этот код в порядок помогла , за что автору большая благодарность.

За внешний вид кастомной записи отвечает файл single.php , но чтобы изменить вид кастомной записи можно создать файл single-{post_type}.php – в моем случае будет single-articles.php со своим содержимым.

Теперь нужно вывести кастомные записи на странице. По умолчанию за отображение архива кастомных записей отвечает файл index.php . Но можно создать файл, который будет отвечать за вывод кастомных записей в своей таксономии.

Вариант 1 – самый правильный. Выводим записи в таксономии так же как и в обычной категории.

Для этого создаем файл taxonomy-{taxonomy}.php – в моем случае будет taxonomy-articles_category.php и в нем выводим обычный цикл, как и для стандартных записей в категории:

В файле tax-item.php выводим данные, которые нам нужно получить из каждой записи, например, заголовок, ссылку на запись, миниатюру и excerpt.

В файле pagination.php выводим пагинацию вот такого формата .

Цикл не изменяем, пагинация отлично работает. Это самый оптимальный вариант для отображения Кастомных Таксономий.

Вариант 2 – если нет кастомных таксономий, то можно просто получить все кастомные записи в виде Архива

Для этого в шаблоне создаем файл archive-{post_type}.php – в моем случае будет archive-articles.php , в котором точно так же как и в таксономии выводим обычный цикл, только вместо заголовка Таксономии выводим имя кастомного типа записи :

При этом варианте, если не создана страница архива для кастомной записи, тогда получить список всех кастомных записей можно по прямой ссылке BLOG_URL?post_type={post_type} или в моем случае http://site.com/articles/ .

Вариант 3. Просто выводим все кастомные записи Articles на странице с заданным шаблоном

"articles", "posts_per_page" => -1); $loop = new WP_Query($args); while ($loop->have_posts()) : $loop->the_post(); get_template_part("include/tax-item"); endwhile; ?>

get_template_part("include/tax-item"); – в файле tax-item.php я вывожу содержимое записи, которое нужно мне для отображения записей внутри цикла (заголовок, миниатюру, дату, цитату и т.д.)

Этот вариант выводит все записи Articles на странице, не зависимо от таксономий (категорий).

А если нам нужно вывести каждую категорию отдельно со своими новостями, тогда используем первый вариант, описанный выше.

При этом, если вы используете плагин Yoast SEO и используете его хлебные крошки:

Тогда при выборе в настройках плагина таксономии “Articles Category” в “Taxonomy to show in breadcrumbs for post types”, в хлебных крошках вы получите ссылку на категорию, к которой принадлежит Новость, при других вариантах вывода кастомных записей это не получалось сделать.