Нашей статьи, посвященной созданию и использованию собственных типов записей, мы охватили суть пользовательских собственных типов записей в 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
По умолчанию: значение аргумента 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"
=> "Добавить новый товар"
, // заголовок тега |
Аплодировать, хлопать, бить в ладони (ладоши). Стоит оратору эффектно закончить хотя бы самую бессодержательную речь, и зал дрожит от рукоплесканий. Браво! Браво! закричали все... и даже в ладоши забили. Тург. Ср. аплодировать... Словарь русских … Словарь синонимов
- (иноск.) одобрять, радоваться (выражая это рукоплесканіемъ хлопаніемъ въ ладони). Ср. Эта выдумка очень понравилась всѣмъ дамамъ: онѣ дружно захлопали въ ладоши. Писемскій. Масоны. 5, 4. Ср. Восплесните руками всѣ народы, воскликните Богу гласомъ … Большой толково-фразеологический словарь Михельсона (оригинальная орфография)
РУКОПЛЕСКАТЬ, рукоплещу, рукоплещешь, несовер., кому чему (книжн.). Ударять, плескать в ладоши в знак одобрения, аплодировать. Весь зал рукоплескал оратору. «Свет ей рукоплещет, свет ей подражает.» Некрасов. Толковый словарь Ушакова. Д.Н. Ушаков … Толковый словарь Ушакова
рукоплескать - рукоплескать, рукоплещу, рукоплещет (не рекомендуется рукоплескаю, рукоплескает); прич. рукоплещущий; дееприч. рукоплеща (неправильно рукоплеща) … Словарь трудностей произношения и ударения в современном русском языке
- (иноск.) одобрять, радоваться (выражая это рукоплесканием хлопанием в ладони) Ср. Эта выдумка очень понравилась всем дамам: они дружно захлопали в ладоши. Писемский. Масоны. 5, 4. Ср. Восплесните руками все народы, воскликните Богу гласом радости … Большой толково-фразеологический словарь Михельсона
Несов. неперех. устар. 1. Ударять, хлопать в ладоши в знак одобрения, горячего признания чего либо; аплодировать. 2. перен. Воздавать похвалы кому либо, горячо одобрять кого либо или что либо. Толковый словарь Ефремовой. Т. Ф. Ефремова. 2000 … Современный толковый словарь русского языка Ефремовой
Рукоплескать, рукоплещу, рукоплещем, рукоплещешь, рукоплещете, рукоплещет, рукоплещут, рукоплеща, рукоплескал, рукоплескала, рукоплескало, рукоплескали, рукоплещи, рукоплещите, рукоплещущий, рукоплещущая, рукоплещущее, рукоплещущие, рукоплещущего … Формы слов
рукоплескать - рукоплеск ать, ещ у, ещет … Русский орфографический словарь
рукоплескать - (I), рукоплещу/, пле/щешь, щут … Орфографический словарь русского языка
Плещу, плещешь; нсв. кому чему и без дополн. = Аплодировать. Р. победителям Олимпийских игр. Р. при появлении режиссёра и киноактёров … Энциклопедический словарь
Книги
- Герои олимпийских игр , В. Л. Штейнбах. В 2008 году Россия отмечает столетие выступления наших спортсменов на Олимпиадах. Это не просто спортивные состязания, Олимпийские игры являются гимном мужеству, стойкости, силе воли и…
- Из писем П. А. Вяземского , Петр Вяземский. «Иван Иванович ‹Дмитриев› написал несколько превосходных басен. Скипетр – в руках законного царя: горе и стыд самозванцам! Разумеется, здесь дело идет не о Крылове: он счастливый смельчак,…
На сегодняшнем уроке мы познакомимся с понятием 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 .