Register_post_type() — позволяет зарегистрировать новый тип поста. Лучшие WordPress-плагины для работы с произвольными типами записей Кастомные типы записей в вордпресс

Аркады 11.07.2023
Аркады

На сегодняшнем уроке мы познакомимся с понятием custom post type , а также научимся создавать свой кастомный post type и шаблон для него. Custom post type это одно из основных направлений в WordPress , с которым работают разработчики.

В WordPress-е блоге посты и страницы - все это post type и чтобы расширить функционал, разработчику нужно добавлять новые post type . Например у вас сайт для продажи книг, вы же не будете публиковать эти книги, как блог-посты. Для этого вы создадите новый post type с названием "book" , у которого будет свой внешний вид, свой шаблон и свои настройки.

Сегодня мы создадим свой post type под названием "book" , который будет иметь кастомный шаблон для публичного поста и для страницы с архивами. Давайте сначала ознакомимся с документацией WordPress - Codex/Post Type . Первым делом в кодексе перечислены все названия в (Default Post Types) , которые мы не можем использовать при регистрации новых названий постов.

Для создания кастомных постов в WordPress существует специальная функция - register_post_type() . Разберем на примере ниже.

Функция register_post_type подключается к ядру WordPress-а при помощи другой функции-хука - add_action . Хук это крючок, за который мы цепляем нашу функцию к ядру WordPress , который при инициализации своих функций, добавляет и нашу.

Давайте попробуем зарегистрировать наш post type , скопируем кусок кода из примера выше и вставим его в файл function.php , стартовой темы underscore , которую мы установили на прошлом уроке и назвали my_theme - "Файлы темы Wordpress" . Сделать это можно через админку WordPress-а в теме, Внешний вид / Редактор , открываете файл function.php и вставляете код из кодекса внизу документа.

Разберем подробнее этот код. WordPress регистрирует post type при помощи функции register_post_type . В круглых скобках передаются параметры, первый параметр acme_product - это id нового типа поста, который мы меняем на свой book .

Register_post_type("book",

За ним идет параметр, который получает эта функция, это массив настроек, в примере их всего три, а в документации гораздо больше. Переименуем "Products" на "books" , а "Product" на "book" .

Array(
"labels" => array(
"name" => __("books"),
"singular_name" => __("book")
),

Public означает, что пост публичный, его видят все и он попадает в архив has_archive .

"public" => true,
"has_archive" => true,
)

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

/**
* My blog custome code.
*/

Сохраняем пост идем в консоль админки и видим новый тип поста book , однако он с минимальным количеством настроек.

На странице codex вы увидите полный список настроек. Нам надо добавить возможность добавления превью-картинки, передадим в массиве параметр "thumbnail" . Кроме того, вернем назад title и editor .

"supports" => array("title", "editor", "thumbnail"),

Точно так же можно добавлять и другие настройки из документации. Рекомендуется для пользовательских названий, в том числе и для post type применять префиксы (my_book) , чтобы избежать конфликта с другими плагинами, ведь названия могут совпасть. Для избежания ошибок WordPress рекомендует все вами разработанные функции, переменные, id , классы и константы прописывать с префиксами.

Кастомный шаблон для нового post type

Создадим два поста в новом типе записей book с названиями Book 1 и Book 2 и откроем сайт по адресу http://my_blog.com/book/.

Мы видим, что загрузился нами созданный post type book , а не дефолтный post type WordPress-а , но загружаются все равно старый archive.php , а нам надо создать свой, вместо дефолтного. Мы хотим, чтобы книги не находились в блог постах, а выглядели иначе, без типичной блоговой структуры. Создадим пустой файл archive-book.php и подключим к нему шапку,

get_header();
?>

get_footer();
?>

и сделаем вывод контента в цикле, скопировав код из раздела документации Post_Types , заменив "product" на "book" .

$args = array("post_type" => "book", "posts_per_page" => 10);
$loop = new WP_Query($args);
while ($loop->have_posts()) : $loop->the_post();
the_title();
echo "

";
the_content();
echo "
";
endwhile;
?>

Аналогичный действия надо сделать и для файла single.php .

Доброго времени суток, дорогие хабравчане, я уже много лет делаю сайты на 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

Создаем кастомный тип записи (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”, в хлебных крошках вы получите ссылку на категорию, к которой принадлежит Новость, при других вариантах вывода кастомных записей это не получалось сделать.

О произвольных типах записей в Вордпрессе (CPT, Custom Post Types in WordPress), как создать и настроить, добавить категории и теги, как сделать вложенные URL /тип записи/рубрика/запись или http://example.com/post_type/category/post/ .
Тут также описывается, как расширить стандартный функционал WordPress, создав новые типы записей, которые можно использовать в различных целях: добавить собственное порфтолио, картотеку фильмов и музыки, каталог продукции, календарь событий, даже сделать свой небольшой интернет-магазин (потому что для большого лучше пользоваться готовыми решениями навроде WooCommerce) или социальную сеть, и много чего ещё в этом духе.
Вначале общая информация, дальше — частности.

О записях в WordPress: где хранятся в базе данных, и как их получить

Абсолютно все записи в WordPress, про которые чуть ниже, хранятся в одной таблице: wp_posts . Метаданные постов, например, данные из метабоксов , хранятся в таблице wp_postmeta .

Приведу пример, как получить 10 записей типа post (стандартные Записи в панели администратора).
В общих чертах, данные особо запрашивать не надо. В шаблонах они уже предустановлены, например, в single.php данные по записи уже доступны для обработки в цикле

If (have_posts()) { while (have_posts()) { the_post(); // Тут используем данные из цикла, такие как the_title() и т.п. } }

Если данные нужно получить где-то вне цикла или шаблона, используется запрос WP_Query

$args = array("post_type" => "post", // Тип поста: page, attachment, ... "posts_per_page" => 10, // 10 записей за раз); $p = get_posts($args); // Данные можно раскрыть в цикле if (!empty($p)) { foreach ($p as $post) { setup_postdata($post); ?> ">

Данные можно получить посредством SQL запроса:

Global $wpdb; $query = "SELECT * FROM {$wpdb -> posts} WHERE post_type = "post" LIMIT 10"; $p = $wpdb -> get_results($query); exit(print_r($p)); // в $p теперь массив с данными о постах

Все три способа выше дадут одинаковый результат на выходе.

Предустановленные типы записей в WordPress: post, page, attachment, revision, nav_menu_item

Записи или посты (post)

Самая используемая единица из всех типов, что есть в WordPress — Записи (они же посты, post). Используется в роли постов блога и тому подобного. Имеет 2 предустановленных таксономии: рубрики, они же категории (category) и метки, они же теги (post_tag).
Таксономии служат для сортировки и упорядочивания записей.
Рубрики отличаются от меток тем, что имеют древовидную структуру (могут быть вложенными друг в друга).
Метки являются независимыми друг от друга единицами и этим чем-то похожи на Записи.
Также, по умолчанию, из записей формируется RSS лента сайта на Вордпрессе.

Для Записей используются следующие файлы шаблонов (в порядке приоритета):

  1. single-post.php
  2. single.php
  3. singular.php
  4. index.php

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

Страницы (page)

Страницы используются, в основном, в роли служебных страниц, посадочных страниц — лендингов, сборника энциклопедии и тому подобного. Имеют древовидную иерархию, то есть могут быть вложенными друг в друга, что отразится в адресе конечной страницы (ярлыки родительских будут присутствовать в цепочке URL), и в этой роли имеется возможность выставить им приоритет в сортировке.
Чтобы сделать лендинг, вы можете пойти двумя путями:

Создаём специальный шаблон страницы (page)

Где-нибудь внутри темы в корне или её поддиректории создать файл с произвольным названием и расширением php , например, landing.php . Внутри вы можете разместить совершенно любой шаблон, который может быть абсолютно не похож на другие страницы сайта. Но главное, это поместить вот такой код в начало файла:

Template Name — это специальная метка, которая говорит WordPress о том, что этот файл — специальный шаблон.
Теперь при создании и редактировании любой страницы (page) посмотрите в блоке справа с названием Атрибуты страницы, в нём в разделе Шаблон вы можете выбрать наш уникальный лендинг.

Для Страниц (Page) используется следующая иерархия шаблонов. Как и с Записями, указываю в порядке приоритета:

  1. {шаблон}.php
  2. page-{ярлык_страницы}.php
  3. page-{ID_страницы}
  4. page.php
  5. singular.php
  6. index.php

Прикрепления, вложения или аттачменты (attachment)

Служебный тип, предназначенный для хранения информации о файлах (изображениях, аудио, видео и тому подобных), которые загружались через загрузчик в стандартном редакторе WordPress при редактировании Записи, Страницы или подобного: размер, вес, описание, к какому посту или странице прикреплены, и тому подобное.

Получить вложения для последующей манипуляции над ними можно с помощью следующего кода:

$args = array("post_type" => "attachment", // Тип поста: attachment "post_status" => "inherit", // По умолчанию "publish", а с ним вложения не получить, поэтому указываем специальный статус вложения "inherit"); $p = get_posts($args); exit(print_r($p)); // На выходе будем иметь массив с вложениями

Иерархия шаблонов для аттачментов:

  1. {mime-тип}.php
  2. {mime-подтип}.php
  3. {mime-тип-подтип}.php
  4. attachment.php
  5. single.php
  6. singular.php
  7. index.php

Редакции, черновики или ревизии (revision)

Редакции, они же Ревизии — это версии черновиков записей, которые создаются автоматически, пока вы пишете статью в административной панели Вордпресса или сохраняете статью без фактической её публикации.
В процессе написания, для каждой статьи по умолчанию сохраняется каждая версия черновика. Можно сравнить две разные версии, и к нужной можно откатиться назад.
Хранить помногу версий одной и той же статьи — довольно накладно и часто бессмысленно (хотя, наверное, правильнее было бы оставлять всё по умолчанию, регулярно подчищая старые редакции с помощью плагина, например WP Optimize), поэтому число сохраняемых версий Ревизий можно изменить с помощью 2 вариантов:

  1. Использовать фильтр wp_revisions_to_keep
  2. Прописать в wp-config.php //Отключаем ревизии до минимально возможного значения define("WP_POST_REVISIONS", 0);

    Возможные значения:

    • true или -1: сохраняет каждую версию черновика. Вариант по умолчанию
    • false или 0: отключает сохранение черновиков, кроме 1 автосохранения
    • Целое число больше нуля: сохраняется указанное число версий черновиков + 1 автосохранение. Старые версии, не укладывающиеся в указанное число, автоматически удаляются

Элементы навигационного меню (nav_menu_item)

Навигационное меню (nav_menu_item) — это тип записей, который хранит информацию об единице навигации в WordPress. Первый, и пока единственный тип записи, который используется не как остальные типы записей, данные для работы и отображения на сайте получают свои отдельные функции.
Также, навигационные меню по умолчанию не включены. Чтобы их включить, нужно объявить об их поддержке в :

  1. Прописать add_theme_support("menus");
  2. Или зарегистрировать место под меню с помощью register_nav_menu() , тогда поддержка меню включится автоматически

Для получения данных пользуйтесь wp_nav_menu() , потому что WP_Query не будет работать, и это отличительная особенность типа постов nav_menu_item

// Этот код сработает wp_nav_menu(); // Выведет первое зарегистрированное непустое меню // А код ниже работать не будет $args = array("post_type" => "nav_menu_item", // Тип поста: page, attachment, ...); $p = get_posts($args); exit(print_r($p)); // На выходе будем иметь пустой массив

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

Вот мы и подошли к главному — тому инструменту, который позволяет расширить стандартный блоговый функционал WordPress до бесконечных возможностей: пользовательский произвольный тип записи.
Самый простой пример, как можно зарегистрировать наш новый тип записи sheensay_product

Add_action("init", "sheensay_post_type"); function sheensay_post_type() { register_post_type("sheensay_product", array("labels" => array("name" => "Продукция", "singular_name" => "Продукцию",), "public" => true, // тип записи открыт для поиска и тому подобного "has_archive" => true, // Включаем страницы архивов "supports" => array("title", "editor", "thumbnail", "comments"), // Включаем поддержку заголовка, редактора, миниатюры, комментариев)); }

Здесь sheensay_product — это название нового типа записей. Оно не должно конфликтовать с другими в системе, об этом подробнее ниже.
Также, в этом варианте оно служит ярлыком этого типа записей, то есть присутствует в URL. Если же хотите указать другой ярлык, например продукция , делайте как на примере ниже

Add_action("init", "sheensay_post_type"); function sheensay_post_type() { register_post_type("sheensay_product", array("labels" => array("name" => "Продукция", "singular_name" => "Продукцию",), "public" => true, "rewrite" => array("slug" => "продукция"), // Тут определяется ярлык Custom Post Type "has_archive" => true, "supports" => array("title", "editor", "thumbnail"),)); }

Как правильно подобрать название нового типа записи

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

  • attachment
  • revision
  • nav_menu_item
  • action
  • theme
  • order

Также, стоит воздержаться от использования префикса wp_ в начале названия, так как, возможно, это вызовет конфликты с будущими версиями ядра WordPress.
Лучше всего, если вы будете предварять названия произвольными префиксами, связанными с названием вашего сайта, продукта или бренда, например sheensay_product , тогда гарантированно избежите потенциальных конфликтов

Как сделать произвольную таксономию

Произвольные типы записей могут использовать таксономии из записей, например, рубрики (категории) или метки (теги), но можно, чтобы таксономии были свои.

Add_action("init", "sheensay_post_type"); function sheensay_post_type() { // Регистрируем таксономию register_taxonomy("sheensay_product_type", "sheensay_product", array("label" => "Типы", "hierarchical" => true, // Если TRUE, таксономия будет аналогом рубрик (категорий). Если FALSE (по умолчанию), то таксономия станет аналогом меток (тегов). "rewrite" => array("slug" => "тип-продукции"),)); // Регистрируем произвольный тип записи (Custom Post Type) register_post_type("sheensay_product", array("labels" => array("name" => "Продукция", "singular_name" => "Продукцию",), "public" => true, "rewrite" => array("slug" => "продукция"), // Тут определяется ярлык CPT "has_archive" => true, "supports" => array("title", "editor", "thumbnail"), // Включаем поддержку заголовка, редактора, миниатюры)); }

Шаблоны для произвольных типов постов

Всё зависит от того, какого рода информация отображается. Вариантов может быть 3: шаблон конкретной записи, шаблон архивов записей и шаблон таксономий

Шаблон страницы записи

Перечисляются в порядке приоритета

  1. single-{тип_поста}.php
  2. single.php
  3. index.php

Шаблон архива записей

  1. archive-{тип_поста}.php
  2. archive.php
  3. index.php

Шаблон произвольной таксономии

  1. taxonomy-{имя_таксономии}-{имя_термина}.php
  2. taxonomy-{имя_таксономии}.php
  3. taxonomy.php
  4. archive.php
  5. index.php

Здесь имя_таксономии — это sheensay_product_type , а имя_термина — это ярлык той таксономии, что вы создадите в админке.

Как получить данные произвольного типа записей (Custom Post Type WordPress) и отобразить на сайте

Получить данные произвольного типа записей (Custom Post Type) в WordPress для отображения на сайте можно теми же способами, что и обычные Записи и Страницы

$args = array("post_type" => "sheensay_product", // Указываем наш новый тип записи "posts_per_page" => 10,); $p = get_posts($args); foreach ($p as $post) { setup_postdata($post); ?> ">

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

// Подключаем к стандартным "post" и "page" наш "sheensay_product" add_action("pre_get_posts", "add_sheensay_product_in_main_query"); function add_sheensay_product_in_main_query($query) { if (is_archive() && $query -> is_main_query()) $query -> set("post_type", array("post", "page", "sheensay_product")); return $query; }

Готовый класс для создания произвольного типа записей с произвольной таксономией

Ниже представлен класс, с помощью которого вы сможете зарегистрировать любой произвольный тип записей с собственной таксономией, а URL будет иметь вид
http://example.com/продукция/тип/продукт

Чтобы URL формировался, вы должны перейти в настройки постоянных ссылок /wp-admin/options-permalink.php и установить любой отличный от простого вид общих настроек

Ниже сам код класса. Вы можете не вносить в него никаких изменений, а поменять ярлык типа записи можно в самом конце в строке new Sheensay_Product("продукция");
Сам код пишется в или в . Первый вариант предпочтительнее, так как в этом случае, вы не потеряете доступа к контенту нового типа записей при смене активной темы.

post_type = $post_type; /* * Регистрируем Custom Post Type */ add_action("init", array($this, "sheensay_cpt_product")); /* * Фильтруем URL */ add_filter("post_type_link", array($this, "product_permalink_structure"), 10, 2); /* * Чтобы работала пагинация */ add_action("generate_rewrite_rules", array($this, "fix_product_category_pagination")); } function sheensay_cpt_product() { /* * Регистрируем произвольную таксономию к новому типу записей */ register_taxonomy("sheensay_product_type", "sheensay_product", array("label" => "Типы", "hierarchical" => true, "query_var" => true, "rewrite" => array("slug" => $this -> post_type),)); /* * Регистрируем новый тип записи */ $labels = array("name" => "Продукция", // Основное название "singular_name" => "Продукцию", // Добавить "add_new" => "Добавить новую", // Имя ссылки на новую запись в сайдбаре "add_new_item" => "Добавить новую продукцию", // Заголовок в редакторе при добавлении новой записи); $args = array("labels" => $labels, "public" => true, "publicly_queryable" => true, "show_ui" => true, "query_var" => true, "capability_type" => "post", "hierarchical" => false, "menu_position" => null, "supports" => array("title", "editor", "thumbnail", "excerpt"), "rewrite" => array("slug" => $this -> post_type . "/%sheensay_product_type%", "with_front" => false,), "has_archive" => $this -> post_type,); register_post_type("sheensay_product", $args); if (current_user_can("manage_options")) // Вот с этой функцией осторожней. Она сбрасывает все правила определения URL. Лучше её закомментировать после завершения всех работ flush_rewrite_rules(); } function product_permalink_structure($post_link, $post) { if (FALSE !== strpos($post_link, "%sheensay_product_type%")) { $product_type_term = get_the_terms($post -> ID, "sheensay_product_type"); if (!empty($product_type_term)) $post_link = str_replace("%sheensay_product_type%", $product_type_term -> slug, $post_link); } return $post_link; } function fix_product_category_pagination($wp_rewrite) { unset($wp_rewrite -> rules[ $this -> post_type . "/([^/]+)/page/?({1,})/?$"]); $wp_rewrite -> rules = array($this -> post_type . "/?$" => $wp_rewrite -> index . "?post_type=sheensay_product", $this -> post_type . "/page/?({1,})/?$" => $wp_rewrite -> index . "?post_type=sheensay_product&paged=" . $wp_rewrite -> preg_index(1), $this -> post_type. "/([^/]+)/page/?({1,})/?$" => $wp_rewrite -> index . "?sheensay_product_type=" . $wp_rewrite -> preg_index(1) . "&paged=" . $wp_rewrite -> preg_index(2),) + $wp_rewrite -> rules; } } /* * Запускаем класс * В скобках можно определить название ярлыка типа записи */ new Sheensay_Product("продукция");

Теперь в админке вы можете зарегистрировать новую продукцию и их типы

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

С версии 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; }

Рекомендуем почитать

Наверх