Кастомные типы записей в вордпресс. Произвольный тип записей в WordPress — register_post_types, register_taxonomy

Нашей статьи, посвященной созданию и использованию собственных типов записей, мы охватили суть пользовательских собственных типов записей в 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 был просто системой для блогов, прошли. Возможность расширения функционала с помощью плагинов и тем, группировка постов, структурирование данных по типам, а также появление в ядре WP Rest API привели к эволюционированию WordPress в полномасштабную систему управления контентом и платформу разработки.

За эти годы я успешно создал большое количество кастомных веб-приложений на новейших версиях WordPress, в которых по полной использовались кастомные типы постов. Примером может послужить сайт theme marketplace моего плагина для WordPress ProfilePress .

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

Ну хватит долгих речей, перейдем к основной цели данного урока – изучению всех тонкостей пользовательских типов в WordPress.

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

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

WordPress может хранить и отображать множество различных типов контента. Одна часть данного контента называется постом, хотя пост сам по себе является специфическим типом постов. «Все типы постов хранятся в одном месте, в таблице wp_posts базы данных, но посты различаются по колонке post_type»

Post type относится к различным структурированным данным, сгруппированным вместе, и которые обслуживаются в базе данных WordPress в таблице posts.

Примером типа постов служит тип post (группа постов из блога), page (группа страниц), attachment (группа загружаемых медиа файлов), а также revision (группа редакций постов). Все эти типы родные или встроенные в WordPress. Зная, что такое тип поста, можно создать и зарегистрировать новый тип, который будет относиться к кастомным типам постов.

Если вы создаете сайт для компании или бизнеса на WordPress, то типами постов могут быть Portfolio, Testimonials и Products. Теперь, когда мы разобрались с концепцией пользовательских типов постов, давайте научимся их создавать.

Как создать пользовательский тип постов

Создать пользовательский тип постов довольно просто. Сперва, необходимо зарегистрировать тип при помощи функции register_post_type(), затем поместить его в функцию и прикрепить все это к экшену init:

function portfolio_cpt() { $args = array("label" => "Portfolio", "public" => true,); register_post_type("portfolio", $args); } add_action("init", "portfolio_cpt");

function portfolio_cpt () {

$ args = array (

"label" = > "Portfolio" ,

"public" = > true ,

register_post_type ("portfolio" , $ args ) ;

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

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

function portfolio_cpt() { register_post_type("portfolio"); } add_action("init", "portfolio_cpt");

function portfolio_cpt () {

register_post_type ("portfolio" ) ;

add_action ("init" , "portfolio_cpt" ) ;

Если создать тип, как показано выше, то он не будет отображаться в панели администратора (хотя к нему по-прежнему можно обратиться по ссылке http://example.com/wp-admin/edit.php?post_type=portfolio“), название также не будет отображаться (label), а уведомления администратора будут такими же, как и для встроенных типов постов. Пробежимся по аргументам массива настройки пользовательских типов и по соответствующим функциям.

Label

Множественное описательное имя типа. К примеру, если создать тип movie, то он должен называться Movies. По умолчанию стоит $post_type – первый параметр в функции register_post_type().

Labels

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

name: Множественная форма названия типа постов.

singular_name: Форма названий типов постов в единственном числе.

add_new: Пункт меню для добавления нового поста.

add_new_item: При создании нового поста отображается заголовок.

edit_item: Заголовок отображается при редактировании поста.

new_item: Отображается в меню любимых в шапке панели администратора.

search_items: Текст кнопки панели поиска на экране редактирования поста.

not_found: Текст отображается, когда не найдено ни одного поста в поиске через панель администратора.

not_found_in_trash: Текст отображается, когда в корзине нет постов.

Полный список лейблов и их описаний можно найти по ссылке .

Description

Краткое описание типа поста. Я не нашел, где в WordPress можно это задействовать.

Public

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

show_ui: задает, отображать ли экраны панели администратора.

publicly_queryable: задает, можно ли выполнить запросы по этому типу постов со стороны пользователя.

exclude_from_search: должны ли посты появляться в результатах поиска.

menu_position

По умолчанию новый тип постов добавляется после пункта меню «Комментарии» в панели администратора. Но есть возможность передвинуть данный новый пункт меню. К примеру, если задать menu_position значение 70, то ваш пункт меню окажется ниже пункта «Пользователи».

menu_icon

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

"menu_icon" => get_stylesheet_directory_uri() . "/images/portfolio-icon.png",

Hierarchical

С помощью этого аргумента можно задавать иерархию для новых типов. По умолчанию стоит значение false. Если установить true, новые типы станут иерархическими.

Supports

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

title: Поле ввода текста для создания заголовка поста.

editor: TinyMCE редактор для написания текста поста.

thumbnail: встроенные изображения.

excerpt: Область textarea для отрывка поста.

trackbacks: включение и отключение трекбеков и пингбеков.

custom-fields: кастомные поля input.

comments: включение или отключение комментариев.

revisions: Возможность редакции постов.

post-formats: Добавляет форматы постов

page-attributes: Атрибуты страницы. Важный параметр для иерархических типов постов, можно выбрать родительский пост.

register_meta_box_cb

Добавляет колбэк функцию, которая вызывается при установке мета боксов для формы редактирования. Функция принимает один аргумент $post, в котором хранится объект WP_Post текущего редактируемого поста. Функция особенно полезна для разработчиков. С ее помощью можно создавать пользовательские мета боксы, которые будут отображаться на экране редактирования типа.

"register_meta_box_cb" => "metabox_callback_func",

has_archive

Если установить данный аргумент в true, к кастомным типам постов добавятся архивы. К примеру, новый тип books, если зайти на страницу http://yoursite.com/books, то отобразится список постов по типу books.

Rewrite

С помощью данного аргумента при просмотре одного поста или архива можно задать структуру ссылок данного типа. По умолчанию стоит true и используется переменная $post_type. Чтобы отключить перезапись, необходимо установить данный параметр в false. Для полной ясности разберем пару примеров. Скажем, вы создали новый тип постов review и хотите изменить URL с review на assessment. Аргумент для перезаписи ниже изменит URL с http://example.com/review/harry-potter/ на http://example.com/assessment/harry-potter/ для конкретного поста и http://example.com/review/ на http://example.com/assessment/ для архива данного типа.

false

Всегда при изменении URL в WordPress сохраняйте изменения в панели Настройки >> ссылки для повторного создания правил перезаписи. Параметр slug отвечает за URL, а with_front задает будет структуру ссылки. Все еще не поняли для чего нужен with_front? Разберем пример. Скажем, структура вашей ссылки точно такая же как на изображении ниже с надписью blog на конце.

Если with_front равен false, URL конкретного поста и архива будут выглядеть http://example.com/blog/assessment/harry-potter/ и http://example.com/blog/assessment соответственно, но если задать true, то ссылки к посту и к архиву будут следующие http://example.com/assessment/harry-potter/ и http://example.com/assessment/. Заметили, что в последних ссылках нет blog? Вот в этом разница.

can_export

С помощью данного аргумента можно задать, можно ли экспортировать посты кастомного типа через инструменты WordPress. По умолчанию стоит true.

query_var

С помощью данного аргумента можно контролировать переменные запроса, используемые для получения постов данного типа.
Если задано true, вы сможете запросить кастомный тип book по ссылке example.com/?book=harry-potter, где harry-potter это параметр slug ссылки. Если задать строку, а не true, можно написать так: example.com/?publication=harry-potter.

Нюанс с query_var

Если query_var не задан в аргументе массива регистрации типа, по умолчанию устанавливается значение $post_type, т.е. данный параметр задан всегда, если его принудительно не установить в false.

И тут есть один нюанс. Если значение query_var добавить через строку запроса в URL, всегда будет выдаваться страница 404. Тут нужно прояснить. Скажем, значение query_var равно review, то URL вашего сайта можно указать в любой из следующих форм:

Эти ссылки приведут вас на странице 404. Об этом я узнал по собственному горькому опыту. Когда я столкнулся с этой проблемой я создал тему на WordPress core trac и сообщил об ошибке. У меня ушло несколько недель на то, чтобы разобраться с этой проблемой перед тем, как мне ответила команда WordPress.

Ускоряем настройку пользовательских типов постов с помощью плагинов

Теперь, когда мы разобрались с основами, стоит сказать о том, что существует масса плагинов для WordPress, с помощью которых можно сильно упростить процесс создания кастомных типов постов. Примеры (не все):

Custom Post Type UI

Custom Post Type Maker

Заключение

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

$post_type (строка ) то, как вы хотите назвать свой тип поста, это название в дальнейшем будет использоваться в параметрах многих функций, учтите это. Кроме того, нельзя использовать в качестве названий следующие зарезервированные вордпрессом слова:

  • attachment
  • revision
  • nav_menu_item
  • custom_css
  • customize_changeset
  • action
  • order
  • theme
  • author
$args (массив ) включает в себя следующие параметры: labels (массив ) позволяет подписать элементы интерфейса данного типа записи. Подробнее в примере в конце поста. description (строка ) описание регистрируемого типа записей. Насколько мне известно, этот параметр не используется где-либо в движке WordPress или в стандартных плагинах и темах. Но вполне может использоваться в сторонних плагинах или темах. public (логическое ) обобщает следующие несколько параметров, устанавливая для них соответствующие значения по умолчанию publicly_queryable (логическое ) нужно ли элементы данного типа записей сделать доступными на сайте. Подробнее про задачу этого параметра .
По умолчанию: значение аргумента public . exclude_from_search (логическое )
  • true — исключить записи данного типа из результатов поиска на сайте,
  • false — не исключать.

По умолчанию: противоположные значения параметра public . show_in_nav_menus (логическое ) нужно ли элементы данного типа записей сделать доступными для добавления в меню сайта.
По умолчанию: значение аргумента public . show_ui (логическое ) нужно ли добавлять стандартный интерфейс в админке для редактирования и добавления записей данного типа.
По умолчанию: значение аргумента public .

Show_in_menu (логическое |строка ) нужно ли добавлять пункты в меню админки.

По умолчанию: значение аргумента show_ui . show_in_admin_bar (логическое ) нужно ли добавлять ссылку на создание новой записи данного типа в админ панель.

По умолчанию: значение аргумента show_in_menu . menu_position (целое число ) порядок расположения в меню в админке.

menu_icon (строка ) абсолютный URL иконки для меню. Оптимальное разрешение изображения 16×16 пикселей.

Кроме того, в WordPress 3.8 появился встроенный пакет иконок — вы можете использовать любую из этих иконок, просто указав её название в качестве значения параметра, например dashicons-cart .

По умолчанию используется иконка обычных записей. delete_with_user (логическое ) при удалении пользователя на блоге, нужно ли автоматически удалять все записи данного типа, которые он опубликовал.
По умолчанию: false . hierarchical (логическое ) должен ли данный тип постов иметь иерархию.
По умолчанию: false . has_archive (логическое |строка ) должен ли данный тип постов иметь собственную страницу архивов. В качестве значения параметра можно указать ярлык страницы архивов.
По умолчанию: false . rewrite (массив |логическое ) устанавливает правила для постоянных ссылок в URL. Если в качестве значения данного параметра указать false , то правила для постоянных ссылок создаваться не будут.

Slug (строка ) ярлык, используемый для записей данного типа (по умолчанию — название типа поста) with_front (логическое ) нужно ли добавлять в постоянные ссылки значение $wp_rewite->front (по умолчанию — true) feeds (логическое ) нужно ли создавать RSS ленту для данного типа поста (по умолчанию — значение параметра has_archive) pages (логическое ) нужно ли разрешить постраничную навигацию в постах регистрируемого типа, используя тег (по умолчанию — true) supports (массив ) какие нужно добавить на страницы редактирования записей данного типа.

  • title — поле для ввода заголовка поста
  • editor — текстовый редактор
  • excerpt — метабокс «Цитата»
  • author — метабокс «Автор»
  • thumbnail — метабокс «Миниатюра записи» (кроме того, ваша тема должна их поддерживать)
  • comments — метабокс «Комментарии» (если указано, то разрешены комментарии к постам регистрируемого типа)
  • trackbacks — метабокс «Отправить обратные ссылки»
  • custom-fields — метабокс «Произвольные поля» (произвольные поля будут поддерживаться в любом случае)
  • revisions — метабокс «Редакции» (если указано, то в базе данных будут создаваться редакции постов данного типа)
  • page-attributes — метабокс «Атрибуты страницы» с возможностью выбора родительского эоемента и установления порядка menu_order
  • post-formats — метабокс «Формат», про форматы постов читайте подробнее .
  • taxonomies (массив ) массив таксономий, например category или post_tag , которые будут использоваться для данного типа записей. Присвоить таксономии можно также при помощи функции .

    Пример регистрации типа поста

    Если не знаете, куда вставлять код — вставляйте в functions.php вашей текущей темы.

    add_action ( "init" , "true_register_products" ) ; // Использовать функцию только внутри хука init function true_register_products() { $labels = array ( "name" => "Товары" , "singular_name" => "Товар" , // админ панель Добавить->Функцию "add_new" => "Добавить товар" , "add_new_item" => "Добавить новый товар" , // заголовок тега </span> "edit_item" => <span>"Редактировать товар" </span>, "new_item" => "Новый товар" , "all_items" => "Все товары" , "view_item" => <span>"Просмотр товаров на сайте" </span>, "search_items" => "Искать товары" , "not_found" => <span>"Товаров не найдено." </span>, "not_found_in_trash" => <span>"В корзине нет товаров." </span>, "menu_name" => "Товары" <span>// ссылка в меню в админке </span> ) ; $args = array ( "labels" => $labels , "public" => true , <span>// благодаря этому некоторые параметры можно пропустить </span> "menu_icon" => "dashicons-cart" , <span>// иконка корзины </span> "menu_position" => 5 , "has_archive" => true , "supports" => array ( "title" , "editor" , "excerpt" , "thumbnail" , "comments" ) , "taxonomies" => array ("post_tag" ) ) ; register_post_type("product" ,$args ) ; } </td> </tr></table><p><span class="koXPsjWcBis"></span></p></ul> <ul><p>Аплодировать, хлопать, бить в ладони (ладоши). Стоит оратору эффектно закончить хотя бы самую бессодержательную речь, и зал дрожит от рукоплесканий. Браво! Браво! закричали все... и даже в ладоши забили. Тург. Ср. аплодировать... Словарь русских … <span>Словарь синонимов </p> <p> - (иноск.) одобрять, радоваться (выражая это рукоплесканіемъ хлопаніемъ въ ладони). Ср. Эта выдумка очень понравилась всѣмъ дамамъ: онѣ дружно захлопали въ ладоши. Писемскій. Масоны. 5, 4. Ср. Восплесните руками всѣ народы, воскликните Богу гласомъ … <span>Большой толково-фразеологический словарь Михельсона (оригинальная орфография) </p> <p>РУКОПЛЕСКАТЬ, рукоплещу, рукоплещешь, несовер., кому чему (книжн.). Ударять, плескать в ладоши в знак одобрения, аплодировать. Весь зал рукоплескал оратору. «Свет ей рукоплещет, свет ей подражает.» Некрасов. Толковый словарь Ушакова. Д.Н. Ушаков … <span>Толковый словарь Ушакова </p> <p><b>рукоплескать </b> - рукоплескать, рукоплещу, рукоплещет (не рекомендуется рукоплескаю, рукоплескает); прич. рукоплещущий; дееприч. рукоплеща (неправильно рукоплеща) … <span>Словарь трудностей произношения и ударения в современном русском языке </p> <p> - (иноск.) одобрять, радоваться (выражая это рукоплесканием хлопанием в ладони) Ср. Эта выдумка очень понравилась всем дамам: они дружно захлопали в ладоши. Писемский. Масоны. 5, 4. Ср. Восплесните руками все народы, воскликните Богу гласом радости … <span>Большой толково-фразеологический словарь Михельсона </p> <p>Несов. неперех. устар. 1. Ударять, хлопать в ладоши в знак одобрения, горячего признания чего либо; аплодировать. 2. перен. Воздавать похвалы кому либо, горячо одобрять кого либо или что либо. Толковый словарь Ефремовой. Т. Ф. Ефремова. 2000 … <span>Современный толковый словарь русского языка Ефремовой </p> <p>Рукоплескать, рукоплещу, рукоплещем, рукоплещешь, рукоплещете, рукоплещет, рукоплещут, рукоплеща, рукоплескал, рукоплескала, рукоплескало, рукоплескали, рукоплещи, рукоплещите, рукоплещущий, рукоплещущая, рукоплещущее, рукоплещущие, рукоплещущего … Формы слов </p> <p><b>рукоплескать </b> - рукоплеск ать, ещ у, ещет … <span>Русский орфографический словарь </p> <p><b>рукоплескать </b> - (I), рукоплещу/, пле/щешь, щут … <span>Орфографический словарь русского языка </p> <p>Плещу, плещешь; нсв. кому чему и без дополн. = Аплодировать. Р. победителям Олимпийских игр. Р. при появлении режиссёра и киноактёров … <span>Энциклопедический словарь </p> </ul><h3>Книги</h3> <ul><li>Герои олимпийских игр , В. Л. Штейнбах. В 2008 году Россия отмечает столетие выступления наших спортсменов на Олимпиадах. Это не просто спортивные состязания, Олимпийские игры являются гимном мужеству, стойкости, силе воли и… </li> <li>Из писем П. А. Вяземского , Петр Вяземский. «Иван Иванович ‹Дмитриев› написал несколько превосходных басен. Скипетр – в руках законного царя: горе и стыд самозванцам! Разумеется, здесь дело идет не о Крылове: он счастливый смельчак,…</li></ul> <p>На сегодняшнем уроке мы познакомимся с понятием <b>custom post type </b>, а также научимся создавать свой кастомный <b>post type </b> и шаблон для него. <b>Custom post type </b> это одно из основных направлений в <b>WordPress </b>, с которым работают разработчики.</p> <p>В <b>WordPress-е </b> блоге посты и страницы - все это <b>post type </b> и чтобы расширить функционал, разработчику нужно добавлять новые <b>post type </b>. Например у вас сайт для продажи книг, вы же не будете публиковать эти книги, как блог-посты. Для этого вы создадите новый <b>post type </b> с названием <b>"book" </b>, у которого будет свой внешний вид, свой шаблон и свои настройки.</p> <p>Сегодня мы создадим свой <b>post type </b> под названием <b>"book" </b>, который будет иметь кастомный шаблон для публичного поста и для страницы с архивами. Давайте сначала ознакомимся с документацией <b>WordPress </b> - <b>Codex/Post Type </b> . Первым делом в кодексе перечислены все названия в <b>(Default Post Types) </b>, которые мы не можем использовать при регистрации новых названий постов.</p> <p>Для создания кастомных постов в <b>WordPress </b> существует специальная функция - <b>register_post_type() </b>. Разберем на примере ниже.</p> <p><img src='https://i0.wp.com/myrusakov.ru/images/articles/soft_wordpress_custom_post_01.jpg' width="100%" loading=lazy></p> <p>Функция <b>register_post_type </b> подключается к ядру <b>WordPress-а </b> при помощи другой функции-хука - <b>add_action </b>. Хук это крючок, за который мы цепляем нашу функцию к ядру <b>WordPress </b>, который при инициализации своих функций, добавляет и нашу.</p> <p>Давайте попробуем зарегистрировать наш <b>post type </b>, скопируем кусок кода из примера выше и вставим его в файл <b>function.php </b>, стартовой темы <b>underscore </b>, которую мы установили на прошлом уроке и назвали <b>my_theme </b> - "Файлы темы Wordpress" . Сделать это можно через админку <b>WordPress-а </b> в теме, <i>Внешний вид / Редактор </i>, открываете файл <b>function.php </b> и вставляете код из кодекса внизу документа.</p> <p><img src='https://i1.wp.com/myrusakov.ru/images/articles/soft_wordpress_custom_post_02.jpg' width="100%" loading=lazy></p> <p>Разберем подробнее этот код. <b>WordPress </b> регистрирует <b>post type </b> при помощи функции <b>register_post_type </b>. В круглых скобках передаются параметры, первый параметр <b>acme_product </b> - это <b>id </b> нового типа поста, который мы меняем на свой <b>book </b>.</p><p>Register_post_type("book", </p><p>За ним идет параметр, который получает эта функция, это массив настроек, в примере их всего три, а в документации гораздо больше. Переименуем <b>"Products" </b> на <b>"books" </b>, а <b>"Product" </b> на <b>"book" </b>.</p><p>Array(<br> "labels" => array(<br> "name" => __("books"),<br> "singular_name" => __("book")<br>), </p><p><b>Public </b> означает, что пост публичный, его видят все и он попадает в архив <b>has_archive </b>.</p><p> "public" => true,<br> "has_archive" => true,<br>) </p><p>Обязательно выше кода пропишите комментарии, что это за код, чтобы самим потом не забыть, зачем вы туда его поставили.</p> /**<br> * My blog custome code.<br> */ <p>Сохраняем пост идем в консоль админки и видим новый тип поста <b>book </b>, однако он с минимальным количеством настроек.</p> <p><img src='https://i2.wp.com/myrusakov.ru/images/articles/soft_wordpress_custom_post_03.jpg' width="100%" loading=lazy></p> <p>На странице codex вы увидите полный список настроек. Нам надо добавить возможность добавления превью-картинки, передадим в массиве параметр <b>"thumbnail" </b>. Кроме того, вернем назад <b>title </b> и <b>editor </b>.</p><p> "supports" => array("title", "editor", "thumbnail"), </p><p>Точно так же можно добавлять и другие настройки из документации. Рекомендуется для пользовательских названий, в том числе и для <b>post type </b> применять префиксы <b>(my_book) </b>, чтобы избежать конфликта с другими плагинами, ведь названия могут совпасть. Для избежания ошибок <b>WordPress </b> рекомендует все вами разработанные функции, переменные, <b>id </b>, классы и константы прописывать с префиксами.</p> <h2>Кастомный шаблон для нового post type</h2> <p>Создадим два поста в новом типе записей <b>book </b> с названиями <b>Book 1 </b> и <b>Book 2 </b> и откроем сайт по адресу <i>http://my_blog.com/book/. </i></p> <p><img src='https://i0.wp.com/myrusakov.ru/images/articles/soft_wordpress_custom_post_04.jpg' width="100%" loading=lazy></p> <p>Мы видим, что загрузился нами созданный <b>post type book </b>, а не дефолтный <b>post type WordPress-а </b>, но загружаются все равно старый <b>archive.php </b>, а нам надо создать свой, вместо дефолтного. Мы хотим, чтобы книги не находились в блог постах, а выглядели иначе, без типичной блоговой структуры. Создадим пустой файл <b>archive-book.php </b> и подключим к нему шапку,</p><p> <?php<br> get_header();<br> ?> </p><p> <?php<br> get_footer();<br> ?> </p><p>и сделаем вывод контента в цикле, скопировав код из раздела документации <b>Post_Types </b>, заменив <b>"product" </b> на <b>"book" </b>.</p><p> <?php<br> $args = array("post_type" => "book", "posts_per_page" => 10);<br> $loop = new WP_Query($args);<br> while ($loop->have_posts()) : $loop->the_post();<br> the_title();<br> echo "<div class="entry-content">";<br> the_content();<br> echo "</div>";<br> endwhile;<br> ?> </p><p>Аналогичный действия надо сделать и для файла <b>single.php </b>.</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> </div> </article> <div id="comments" class="comments-main"> </div> <nav class="prev-next-nav"> <div class="vce-prev-link"> <a href="/otkryt-fail-v-kompase-onlain-prosmotr-dwg-failov-onlain/" rel="next"><span class="img-wrp"><img width="375" height="195" src="/uploads/e1fde8a05bbede14b4c6242de305b7ee.jpg" class="attachment-vce-lay-b size-vce-lay-b wp-post-image" alt="Просмотр DWG файлов онлайн" / loading=lazy><span class="vce-pn-ico"><i class="fa fa fa-chevron-left"></i></span></span><span class="vce-prev-next-link">Просмотр DWG файлов онлайн</span></a> </div> <!-- /next_post --> <div class="vce-next-link"> <a href="/kody-mob-operatorov-kody-sotovyh-operatorov-rossii/" rel="prev"><span class="img-wrp"><img width="375" height="195" src="/uploads/c8920dd3411d03bf9d3fd05fb598cd43.jpg" class="attachment-vce-lay-b size-vce-lay-b wp-post-image" alt="Коды сотовых операторов россии" / loading=lazy><span class="vce-pn-ico"><i class="fa fa fa-chevron-right"></i></span></span><span class="vce-prev-next-link">Коды сотовых операторов россии</span></a> </div> <!-- /next_post --> </nav> </main> <div class="main-box vce-related-box"> <h3 class="main-box-title">Читайте также</h3> <div class="main-box-inside"> <article class="vce-post vce-lay-d post-3450 post type-post status-publish format-standard has-post-thumbnail hentry category-sadovye-rasteniya category-frukty"> <div class="meta-image"> <a href="/skopirovat-kontakty-s-telefona-htc-na-kompyuter-sozdanie-bekapa/" title="Создание бэкапа с помощью встроенных возможностей Android"> <img width="145" height="100" src="/uploads/618af1c503c685db3f3f333d84dc14f4.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Создание бэкапа с помощью встроенных возможностей Android" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy> </a> </div> <header class="entry-header"> <a href="/skopirovat-kontakty-s-telefona-htc-na-kompyuter-sozdanie-bekapa/" title="Создание бэкапа с помощью встроенных возможностей Android">Создание бэкапа с помощью встроенных возможностей Android</a> </header> </article> <article class="vce-post vce-lay-d post-3448 post type-post status-publish format-standard has-post-thumbnail hentry category-sadovye-rasteniya category-frukty"> <div class="meta-image"> <a href="/yandeks-ty-lapochka-moya-lyubimaya-yandeks-ty-lapochka-chto-za/" title="Яндекс ты лапочка моя любимая"> <img width="145" height="100" src="/uploads/b832c2b5fb611b54e15da02faee42aa8.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Яндекс ты лапочка моя любимая" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy> </a> </div> <header class="entry-header"> <a href="/yandeks-ty-lapochka-moya-lyubimaya-yandeks-ty-lapochka-chto-za/" title="Яндекс ты лапочка моя любимая">Яндекс ты лапочка моя любимая</a> </header> </article> <article class="vce-post vce-lay-d post-3447 post type-post status-publish format-standard has-post-thumbnail hentry category-sadovye-rasteniya category-frukty"> <div class="meta-image"> <a href="/razbiraem-ssd-disk-ssd-diski---chto-eto-takoe-chto-neobhodimo-znat/" title="SSD диски - что это такое?"> <img width="145" height="100" src="/uploads/2023602619bfb7f92d4afff372de0a26.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="SSD диски - что это такое?" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy> </a> </div> <header class="entry-header"> <a href="/razbiraem-ssd-disk-ssd-diski---chto-eto-takoe-chto-neobhodimo-znat/" title="SSD диски - что это такое?">SSD диски - что это такое?</a> </header> </article> <article class="vce-post vce-lay-d post-3446 post type-post status-publish format-standard has-post-thumbnail hentry category-sadovye-rasteniya category-frukty"> <div class="meta-image"> <a href="/kontroller-razryada-li-ion-na-diskretnyh-elementah-zashchita-litii-ionnyh/" title="Защита литий-ионных аккумуляторов (контроллер защиты Li-ion) Заглянем в литиево-ионный аккумулятор сотового телефона"> <img width="145" height="100" src="/uploads/5fcb65e7f38c7b73ca9ee0f5bfe84578.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Защита литий-ионных аккумуляторов (контроллер защиты Li-ion) Заглянем в литиево-ионный аккумулятор сотового телефона" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy> </a> </div> <header class="entry-header"> <a href="/kontroller-razryada-li-ion-na-diskretnyh-elementah-zashchita-litii-ionnyh/" title="Защита литий-ионных аккумуляторов (контроллер защиты Li-ion) Заглянем в литиево-ионный аккумулятор сотового телефона">Защита литий-ионных аккумуляторов (контроллер защиты Li-ion) Заглянем в литиево-ионный аккумулятор сотового телефона</a> </header> </article> </div> </div> </div> <aside id="sidebar" class="sidebar right"> <div id="vce_posts_widget-2" class="widget vce_posts_widget"> <h4 class="widget-title">Популярное</h4> <ul class="vce-post-list" data-autoplay=""> <li> <a href="/kody-oshibok-vkontakte-i-ih-rasshifrovka-kody-oshibok-vkontakte-i-ih/" class="featured_image_sidebar" title="Коды ошибок вконтакте и их расшифровка Рк выдает код ошибки 3"><span class="vce-post-img"><img width="145" height="100" src="/uploads/380136825e68ba499f6baf48c06aae92.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Коды ошибок вконтакте и их расшифровка Рк выдает код ошибки 3" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy></span></a> <div class="vce-posts-wrap"> <a href="/kody-oshibok-vkontakte-i-ih-rasshifrovka-kody-oshibok-vkontakte-i-ih/" title="Коды ошибок вконтакте и их расшифровка Рк выдает код ошибки 3" class="vce-post-link">Коды ошибок вконтакте и их расшифровка Рк выдает код ошибки 3</a> </div> </li> <li> <a href="/sdelat-lyubuyu-familiyu-v-vk-chto-delat-esli-ne-menyaetsya-imya/" class="featured_image_sidebar" title="Что делать, если не меняется имя, фамилия ВКонтакте, отклоняют заявку?"><span class="vce-post-img"><img width="145" height="100" src="/uploads/919125dc0b6f3d907d914fbeddc3e2f5.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Что делать, если не меняется имя, фамилия ВКонтакте, отклоняют заявку?" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy></span></a> <div class="vce-posts-wrap"> <a href="/sdelat-lyubuyu-familiyu-v-vk-chto-delat-esli-ne-menyaetsya-imya/" title="Что делать, если не меняется имя, фамилия ВКонтакте, отклоняют заявку?" class="vce-post-link">Что делать, если не меняется имя, фамилия ВКонтакте, отклоняют заявку?</a> </div> </li> <li> <a href="/kak-postavit-melodiyu-na-zvonok-na-android-kak-ustanovit-melodiyu-na/" class="featured_image_sidebar" title="Как установить мелодию на звонок на андроид?"><span class="vce-post-img"><img width="145" height="100" src="/uploads/9050f2616be57368c62b7466bd59a23c.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Как установить мелодию на звонок на андроид?" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy></span></a> <div class="vce-posts-wrap"> <a href="/kak-postavit-melodiyu-na-zvonok-na-android-kak-ustanovit-melodiyu-na/" title="Как установить мелодию на звонок на андроид?" class="vce-post-link">Как установить мелодию на звонок на андроид?</a> </div> </li> <li> <a href="/samsung-j5-proshivka-ustanovka-oficialnoi-proshivki-na-samsung-galaxy-j5-sm-j500f/" class="featured_image_sidebar" title="Установка официальной прошивки на Samsung Galaxy J5 SM-J500F"><span class="vce-post-img"><img width="145" height="100" src="/uploads/04080ef68ff3ee0b4ca0fc6ef696b69a.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Установка официальной прошивки на Samsung Galaxy J5 SM-J500F" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy></span></a> <div class="vce-posts-wrap"> <a href="/samsung-j5-proshivka-ustanovka-oficialnoi-proshivki-na-samsung-galaxy-j5-sm-j500f/" title="Установка официальной прошивки на Samsung Galaxy J5 SM-J500F" class="vce-post-link">Установка официальной прошивки на Samsung Galaxy J5 SM-J500F</a> </div> </li> <li> <a href="/prestigio-multipad-4-quantum-7-85-obnovlenie-android-prestigio-obnovlyaet-proshivki-celogo/" class="featured_image_sidebar" title="Prestigio multipad 4 quantum 7"><span class="vce-post-img"><img width="145" height="100" src="/uploads/507031ad592c9d9946d32c1193735b5f.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Prestigio multipad 4 quantum 7" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy></span></a> <div class="vce-posts-wrap"> <a href="/prestigio-multipad-4-quantum-7-85-obnovlenie-android-prestigio-obnovlyaet-proshivki-celogo/" title="Prestigio multipad 4 quantum 7" class="vce-post-link">Prestigio multipad 4 quantum 7</a> </div> </li> <li> <a href="/sem-etapov-razvitiya-lichnosti-bolshinstvo-sovremennyh-uchenyh-obyasnyayut-igru/" class="featured_image_sidebar" title="Большинство современных ученых объясняют игру как особый вид деятельности, сложившийся на определенном этапе развития общества Система оценивания экзаменационной работы по обществознанию"><span class="vce-post-img"><img width="145" height="100" src="/uploads/6c900807f3bcfb23f7bfb07b0a9d2b3a.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Большинство современных ученых объясняют игру как особый вид деятельности, сложившийся на определенном этапе развития общества Система оценивания экзаменационной работы по обществознанию" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy></span></a> <div class="vce-posts-wrap"> <a href="/sem-etapov-razvitiya-lichnosti-bolshinstvo-sovremennyh-uchenyh-obyasnyayut-igru/" title="Большинство современных ученых объясняют игру как особый вид деятельности, сложившийся на определенном этапе развития общества Система оценивания экзаменационной работы по обществознанию" class="vce-post-link">Большинство современных ученых объясняют игру как особый вид деятельности, сложившийся на определенном этапе развития общества Система оценивания экзаменационной работы по обществознанию</a> </div> </li> <li> <a href="/kompaniya-mgts-besplatnyi-telefon-goryachei-linii-dlya-svyazi-s/" class="featured_image_sidebar" title="Бесплатный телефон горячей линии для связи с оператором мгтс"><span class="vce-post-img"><img width="145" height="100" src="/uploads/41ae3220dbb0152ee90fa004a3615d40.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Бесплатный телефон горячей линии для связи с оператором мгтс" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy></span></a> <div class="vce-posts-wrap"> <a href="/kompaniya-mgts-besplatnyi-telefon-goryachei-linii-dlya-svyazi-s/" title="Бесплатный телефон горячей линии для связи с оператором мгтс" class="vce-post-link">Бесплатный телефон горячей линии для связи с оператором мгтс</a> </div> </li> <li> <a href="/udalenie-keiloggera-v-windows-7-kak-proverit-kompyuter-na/" class="featured_image_sidebar" title="Как проверить компьютер на наличие кейлоггеров и удалить их"><span class="vce-post-img"><img width="145" height="100" src="/uploads/2e4949fe4636e040072e13c7f9a5a0bd.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Как проверить компьютер на наличие кейлоггеров и удалить их" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy></span></a> <div class="vce-posts-wrap"> <a href="/udalenie-keiloggera-v-windows-7-kak-proverit-kompyuter-na/" title="Как проверить компьютер на наличие кейлоггеров и удалить их" class="vce-post-link">Как проверить компьютер на наличие кейлоггеров и удалить их</a> </div> </li> <li> <a href="/pos-komandy-star-komanda-esc-pos-esc-dlya-pechati-bitovogo-izobrazheniya-na/" class="featured_image_sidebar" title="Команда ESC POS ESC * для печати битового изображения на принтере"><span class="vce-post-img"><img width="145" height="100" src="/uploads/0691773217c930fcc41de76b3deb8295.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Команда ESC POS ESC * для печати битового изображения на принтере" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy></span></a> <div class="vce-posts-wrap"> <a href="/pos-komandy-star-komanda-esc-pos-esc-dlya-pechati-bitovogo-izobrazheniya-na/" title="Команда ESC POS ESC * для печати битового изображения на принтере" class="vce-post-link">Команда ESC POS ESC * для печати битового изображения на принтере</a> </div> </li> <li> <a href="/chto-takoe-google-now-chto-umeet-i-zachem-nuzhen-pomoshchnik-google-now-golosovoi/" class="featured_image_sidebar" title="Что умеет и зачем нужен помощник Google Now"><span class="vce-post-img"><img width="145" height="100" src="/uploads/36fd0dc1acd7ab675c575592f8f30a96.jpg" class="attachment-vce-lay-d size-vce-lay-d wp-post-image" alt="Что умеет и зачем нужен помощник Google Now" sizes="(max-width: 145px) 100vw, 145px" / loading=lazy></span></a> <div class="vce-posts-wrap"> <a href="/chto-takoe-google-now-chto-umeet-i-zachem-nuzhen-pomoshchnik-google-now-golosovoi/" title="Что умеет и зачем нужен помощник Google Now" class="vce-post-link">Что умеет и зачем нужен помощник Google Now</a> </div> </li> </ul> </div> <div class="vce-sticky"></div> </aside> </div> <footer id="footer" class="site-footer"> <div class="container-full site-info"> <div class="container"> <div class="vce-wrap-left"> <p> © 2024. <a href="/" >toyota-nadia.ru</a>. Компьютеры для всех - ToyotaNadia. <script type='text/javascript' src='//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'></script> </p> </div> </div> </div> </footer> </div> </div> <a href="javascript:void(0)" id="back-top"><i class="fa fa-angle-up"></i></a> <script type='text/javascript'> /* <![CDATA[ */ var tocplus = { "smooth_scroll": "1", "visibility_show": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c", "visibility_hide": "\u0421\u043a\u0440\u044b\u0442\u044c", "width": "100%" }; var tocplus = { "smooth_scroll": "1", "visibility_show": "\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c", "visibility_hide": "\u0421\u043a\u0440\u044b\u0442\u044c", "width": "100%" }; /* ]]> */ </script> <script type='text/javascript' src='/assets/min1.js'></script> <script type="text/javascript"> /* <![CDATA[ */ function CopyLink() { var body_element = document.getElementsByTagName('body')[0]; var selection = document.getSelection(); var pagelink = "<p>Источник: <a href='" + document.location.href + "'>" + document.location.href + "</a></p>"; var copytext = selection + pagelink; var newdiv = document.createElement('div'); body_element.appendChild(newdiv); newdiv.innerHTML = copytext; selection.selectAllChildren(newdiv); window.setTimeout(function() { body_element.removeChild(newdiv); }, 0); } document.oncopy = CopyLink; /* ]]> */ </script> </body> </html>