Всем привет! Сегодня на seo-mayak.com мы будем учится создавать произвольные типы записей на CMS WordPress.
Произвольные, или как их еще называют, пользовательские типы записей, наряду с форматами записей позволяют еще больше расширить функционал WordPress.
Возможность создавать свои типы записей появилась давно, еще с выходом версии 2.9. Многое веб-мастера активно пользуются этим дополнительным инструментом, но основная масса сайтов на WordPress работают по стандартной схеме.
Надо наверное сказать, что данный материал довольно сложный, так как изобилует различными php функциями, но я постараюсь, как можно подробней и понятней все расписать и надеюсь Вы во всем разберетесь.
Но если будут вопросы, все готов ответить на них в комментариях. Как говориться, чем смогу, помогу.
Произвольные типы записей конечно не новость. На данную тему написано не мало трудов, как поверхностных, так и глубоких. Меня же сподвигло на написание данного поста простое обстоятельство — подумываю создать на seo-mayak.com новый раздел.
Как будет называться этот раздел я скажу наверное тогда, когда он пополнится первыми материалами и выйдет в свет.
Сейчас же, в первую очередь, я хочу поговорить о том, зачем вообще я взялся его создавать и почему нельзя обойтись стандартными возможностями движка. Поехали!
Для чего нужны произвольные типы записей
Прежде чем, начать рассказывать для чего нужны пользовательские типы записей, я бы хотел объяснить новичкам, что это вообще такое.
На самом деле все просто. В админке, на панели слева, создается новая вкладка с произвольным названием, например:
Данный тип записи будет иметь тот же набор инструментов, что и стандартная запись.
Конечно возникнет вопрос. Для чего же тогда надо создавать этот, своего рода, дубль стандартных записей?
Здесь можно назвать три основные причины.
Причина №1. Все посты, отнесенные к новому типу записей будут иметь свой собственный цикл WordPress и поэтому не будут отображаться на главной странице в виде анонсов.
Лично для моего блога эта причина архиважная, так как я не планирую в статьях нового раздела создавать какие-либо изображения, кроме технических и выводить миниатюры в анонсы.
Причина №2. Превью данных постов не будут отображаться в основной RSS ленте, а при желании для них можно создать отдельный RSS канал и отдельную подписку.
Здесь надо понимать, что если статьи не будут включены в основную RSS ленту, то они не будут приходить на почту моим подписчикам. Надо это мне для того, чтобы те пользователи, которым данный материал не интересен, из-за его углубленной технической направленности, не нервничали и не отписывались от статей основного контента.
Причина №3. Возможность создания отдельного шаблона (внешнего вида сайта) для страниц с произвольными типами записей, что конечно очень удобно.
Надеюсь причины понятны. Теперь давайте приступим к непосредственной реализации поставленной задачи и прежде всего я хочу вас познакомить с функцией register_post_type(), с помощью которой мы будем регистрировать наш новый тип записи.
Функция register_post_type() — регистрация произвольного типа записи
Работает на основе класса: WP_Post_Type().
Вот как выглядит функция регистрации:
register_post_type( $post_type, $args );
Где:
$post_type — Имя регистрируемого типа записи;
$args — Массив аргументов.
В WordPress уже зарезервированно несколько имен для типов записей ($post_type), такие как:
post -> записи,
page -> страницы,
attachment -> вложения (мадиафайлы),
revision -> редакции (подробней о редакциях тут),
nav_menu_item -> элементы меню (внешний вид > меню).
Также в качестве имени нельзя использовать следующие выражения:action,author,order,theme
В качестве примера я назову новый (произвольный) тип записи «help», а все служебные заголовки, уведомления и т.д, будет от слова «Шпаргалка» и для наглядности приведу развернутый шаблон функции register_post_type(), где будет видно все аргументы, которые она может принимать. Приступим!
Это шаблон! Не надо его никуда вставлять!
* Функция регистрации нового типа записи */ add_action('init', 'register_post_types'); function register_post_types(){ $labels = array( 'name' => 'Шпаргалки', 'singular_name' => 'Шпаргалка', 'menu_name' => 'Шпаргалки', 'all_items' => 'Все Шпаргалки', 'add_new' => 'Добавить свежую', 'add_new_item' => 'Добавить свежую шпаргалку', 'edit_item' => 'Редактировать шпаргалку', 'view_item' => 'Посмотреть шпаргалку', 'view_items' => 'Посмотреть архив шпаргалок', 'attributes' => 'Шаблон для шпаргалок', 'search_items' => 'Найти шпаргалку', 'not_found' => 'Шпаргалок не найдено', 'not_found_in_trash' => 'В корзине шпаргалок не найдено', 'parent_item_colon' => '??????' ); $supports = array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'revisions', 'post-formats' ); $rewrite = array( 'slug' => 'hint', 'with_front' => false, 'feeds' => false, 'pages' => true, 'ep_mask' => 'константа', ); $args = array( 'labels' => $labels, 'supports' => $supports, 'rewrite' => $rewrite, 'label' => 'shpargalki', 'public' => true, 'publicly_queryable' => true, 'exclude_from_search' => true, 'show_ui' => true, 'show_in_admin_bar' => true, 'show_in_menu' => true, 'menu_position' => 4, 'menu_icon' => 'dashicons-plus-alt', 'hierarchical' => false, 'taxonomies' => array( 'category', 'post_tag' ), 'has_archive' => false, 'can_export' => true, 'query_var' => true, 'register_meta_box_cb' => 'название_callback_функции', // Для профессионалов 'map_meta_cap' => false, 'capability_type' => 'crib', 'capabilities' => array( "edit_post '=>' edit_crib", "read_post '=>' read_crib", "delete_post '=>' delete_crib", "edit_posts '=>' edit_cribs", "edit_others_posts '=>' edit_others_cribs", "publish_posts '=>' publish_cribs", "read_private_posts '=>' read_private_cribs", "create_posts '=>' edit_cribs" ), 'show_in_rest' => false, 'rest_base' => $post_type, 'rest_controller_class' => 'контроллер', '_builtin' => false, '_edit_link#039; => 'post.php?post=%d' ); register_post_type('help',$args); }
А теперь давайте подробно разберем, как работает данная функция, что в ней прописано и на что влияет тот или иной элемент.
Функция включает в себя двумерный ассоциативный массив array, все аргументы которого принимает переменная $args.
На заметку! Ассоциативным называется массив, состоящий из связки (ассоциации) двух элементов: ключа (аргумента) и его значения ( 'ключ' => 'значение' ).
Также функция имеет несколько массивов нижнего уровня, вот с них и начнем.
И первый массив, который мы разберем на винтики — массив labels.
Массив $labels
$labels = array('ключ' => 'значение') — Все значения ключей в данном массиве — это тексты: кнопок, заголовков или уведомлений, которые будут отображаться в админке. Вообще слово labels в переводе с англ — этикетка. Скоро вы все сами увидите.
name
'name' => 'Шпаргалки' — Не путать с именем $post_type. Здесь мы задаем заголовок для страницы создания/редактирования регистрируемого типа записи:
По умолчанию: значение аргумента label.
singular_name
'singular_name' => 'Шпаргалку' — Тут все зависит от Имени типа записи и от того склоняется оно или нет (смотрите скриншот):
По умолчанию: последовательная цепочка значений аргументов name -> label.
menu_name
'menu_name' => 'Шпаргалки' — Выводит заголовок меню нового типа записи в админке на панели слева:
По умолчанию: последовательная цепочка значений аргументов name -> label.
all_items
'all_items' => 'Все Шпаргалки' — Выводит вкладку управления новыми типами записей в подменю:
По умолчанию: последовательная цепочка значений аргументов menu_name -> name -> label.
add_new
'add_new' => 'Добавить свежую' — Выводит вкладку управления новыми типами записей в подменю:
По умолчанию: текст из меню зарезервированного типа записи «post» — «Добавить новую».
add_new_item
'add_new_item' => 'Добавить свежую шпаргалку' — при добавлении новой записи, на странице в админке будет выведен соответствующий заголовок:
По умолчанию: текст «Добавить запись».
edit_item
'edit_item' => 'Редактировать шпаргалку' — Данный заголовок будет выведен на страницу при редактировании записи произвольного типа:
Тот же текст будет выведен в меню быстрого доступа непосредственно на самой странице:
По умолчанию: текст «Редактировать запись».
view_item
'view_item' => 'Посмотреть шпаргалку' — Это уведомление появится в админке, в меню быстрого доступа:
По умолчанию: текст «Посмотреть запись».
view_items
'view_items' => 'Посмотреть архив шпаргалок' — Ссылка для просмотра главной страницы типа записи. Это уведомление также появится в меню быстрого доступа:
По умолчанию: текст «Просмотр записей».
attributes
'attributes' => 'Шаблон для шпаргалки' — Заголовок метабокса для выбора шаблона записи.
По умолчанию: текст «Свойство записи».
search_items
'not_found' => 'Найти шпаргалку' — Текст для кнопки поиска в админке:
По умолчанию: текст «Поиск записей».
not_found
'not_found' => 'Шпаргалок не найдено' — Текст сообщения при отсутствии записей и если запись не будет найдена через поиск:
По умолчанию: текст «Записей не найдено».
not_found_in_trash
'not_found_in_trash' => 'В корзине шпаргалок не найдено' — Данное уведомление отобразится при пустой корзине:
По умолчанию: текст «Записей в корзине не найдено».
new_item
'new_item' => 'Новая шпаргалка' — Я так и не нашел, где должен отображаться этот текст, хотя данный аргумент описан в кодексе WorsPress.
parent_item_colon
'parent_item_colon' => 'Родительская шпаргалка' — Параметр, предназначенный для произвольных типов записей с древовидной (родительской) структурой, как у страниц page, но я также не нашел, где должен выводится данный текст.
Массив $supports
$supports = array('список элементов') — Это простой, не ассоциативный массив, который состоит из обыкновенной последовательности элементов, перечисленных через запятую.
'title' — Выводит текстовое поле для заголовка;
'editor' — Выводит текстовый редактор TinyMCE;
'author' — Выводит блок «Автор»;
'thumbnail'— Выводит блок «Миниатюра записи»;
'excerpt' — Выводит блок «Цитата»;
'comments' — Выводит блок «Комментарии»
'trackbacks' — Выводит блок «Отправить обратные ссылки»;
'custom-fields' — Выводит блок «Произвольные поля»;
'revisions' — Выводит блок «Редакции»;
'post-formats' — Выведет блок «Формат»;
'page-attributes' — Выведет блок «Атрибуты».
Отдельно хочу остановится на элементе 'page-attributes', который выводит блок «Атрибуты».
Данный блок предназначен только для страниц типа page, которые могут иметь древовидную структуру (страницы и подстраницы), а также в данном блоке можно выбрать шаблон для страницы. Понятно, что такой блок не подойдет для страниц типа single. Чуть ниже я еще вернусь к этой теме.
Дополнительно все блоки включить или отключить можно в интерфейсе «Настройки экрана»:
По умолчанию: array('title','editor')
Массив $rewrite
'rewrite' => true, (логическое) — Включает/отключает ЧПУ для регистрируемого типа записи. При значении false ЧПУ отключены.
Если установить значение true, в массив по умолчанию будут включены следующие значения:
slug
'slug' => 'new prefix', (логическое/массив) — Создает префикс для ЧПУ site.ru/префикс/ярлык_записи. Чтобы создать свой префикс, используйте конструкцию array( 'slug' => 'new prefix').
По умолчанию: Имя типа записи (post-type).
with_front
'with_front' => true, (логическое) — Определяет вставлять (true) или не вставлять (false) в URL общий префикс из настроек.
Допустим, что структура ЧПУ записей у нас выглядит так — blog/%postname%, тогда при значении true префикс добавляется и URL будет таким — site.ru/blog/help/название_поста, а при значении false URL будет следующим — site.ru/help/название_поста.
По умолчанию: true.
feeds
'feeds' => true, (логическое) — Определяет добавлять (true) или не добавлять (false) правило ЧПУ для регистрируемого типа записи.
По умолчанию: значение аргумента has_archive.
pages
'pages' => true, (логическое) — Определяет добавлять (true) или не добавлять (false правило ЧПУ для страниц пагинации регистрируемого типа записи.
По умолчанию: значение аргумента true.
ep_mask
'ep_mask' => константа, (константа) — Перезаписывает маску постоянной ссылки (только для опытных). Все константы масок можно посмотреть wp-includes/rewrite.php.
По умолчанию: константа EP_PERMALINK.
Аргументы массива $args
'label' => 'shpargalki' (строка) — Имя произвольного типа записи (необязательно).
При использовании по умолчанию для других атрибутов, значение будет переведено на русский язык.
По умолчанию: значение $post_type.
'public' => true, (логическое) — Аргумент может принимать два логических значения: true (истина) или false (ложь).
Определяет включать значение аргумента view_item в меню быстрого доступа или не включать:
В произвольное меню:
Также значения данного аргумента включают/отключают вывод блока «Постоянная ссылка»:
Это значит, что при значении false страница будет отдавать ошибку 404.
По умолчанию: false
'publicly_queryable' => true, (логическое) — Включает/отключает вывод блока «Постоянная ссылка», а также включает/отключает вывод кнопки «Посмотреть изменения»:
При значении false на страницы данного типа записей попасть уже не удастся, даже если вбить прямой URL, будет осуществляться редирект на главную.
По умолчанию: значение аргумента public.
'exclude_from_search' => true, (логическое) — Включает/исключает страницы данного типа из общего поиска по сайту (true — участвуют в поиске, false — не участвуют в поиске).
По умолчанию: обратное значение аргумента public.
'show_ui' => true, (логическое) — Выводит/убирает меню управления данным типом записи, что расположено в админке на панели слева (true — показывать меню, false — не показывать меню).
По умолчанию: значение аргумента public.
'show_in_menu' => true, (логическое/строка) — Выводит меню управления данным типом записи в админку на панель слева (true — показывать меню, false — не показывать меню, строка — выводить как подменю).
Если со значениями true и false должно быть все понятно, то со значением строка надо разобраться.
Конечно строка — это условное обозначение, на самом деле сюда вписывается часть урла административных страниц, на которые ведут вкладки: записи, страницы, медиафайлы и т.д.
Например, если мы для атрибута show_in_menu зададим строковое значение 'edit.php', то получим меню 2 уровня (подменю):
Все возможные строковые значения атрибута show_in_menu:
'index.php' — Вкладка «Консоль»;
'edit.php' — Вкладка «Записи»;
'upload.php' — Вкладка «Медиафайлы»;
'link-manager.php' — Вкладка «Ссылки»;
'edit.php?post_type=page' — Вкладка «Страницы»;
'edit-comments.php' — Вкладка «Комментарии»;
'themes.php' — Вкладка «Внешний вид»;
'plugins.php' — Вкладка «Плагины»;
'users.php' — Вкладка «Пользователи»;
'tools.php' — Вкладка «Инструменты»;
'options-general.php' — Вкладка «Настройки».
По умолчанию: значение аргумента show_ui.
'show_in_admin_bar' => true, (логическое) — Определяет добавлять или не добавлять данные регистрируемого типа записи в меню быстрого доступа (админ-бар).
По умолчанию: значение аргумента show_in_menu.
'menu_position' => 4, (число) — Числовое значение данного атрибута задает место отображения меню нового типа записи в админке на панели слева.
Все возможные числовые значения атрибута menu_position:
1 — Поверх всех вкладок;
2-3 — Под вкладкой «Консоль»;
4-9 — Под вкладкой «Записи»;
10-14 — Под вкладкой «Медиафайлы»;
15-19 — Под вкладкой «Ссылки»;
20-24 — Под вкладкой «Страницы»;
25-59 — Под вкладкой «Комментарии»;
60-64 — Под вкладкой «Внешний вид»;
65-69 — Под вкладкой «Плагины»;
70-74 — Под вкладкой «Пользователи»;
75-79 — Под вкладкой «Инструменты»;
80+ — Под вкладкой «Настройки»;
По умолчанию: под вкладкой «Комментарии».
'menu_icon' => 'dashicons-plus-alt' (строка) — Выводит иконку для произвольного типа записи:
С выходом WordPress 3.8 разработчики добавили внушительный пакет иконок. Все иконки можно посмотреть здесь.
Надо всего лишь выбрать подходящую иконку и вписать ее название в качестве значения для аргумента menu_icon.
По умолчанию: dashicons-admin-post.
'show_in_nav_menus' => true, (логическое) — Определяет включать или не включать регистрируемый тип записи в произвольное меню.
По умолчанию: значение аргумента public.
'hierarchical' => false, (логическое) — Определяет какую структуру будет иметь данный тип записи: true — древовидную (страницы/подстраницы) или false — таксономическую (категории/подкатегории).
По умолчанию: false.
'taxonomies' => array(), (массив) — Подключает новый тип записей к уже зарегистрированным таксономиям (подробней о таксономиях тут).
Т.е, если мы хотим, чтобы посты из нового типа были связанны зарегистрированными таксономиями, то в данном параметре надо их перечислить. Например: 'taxonomies' => array('category','post_tag').
По умолчанию: нет.
'has_archive' => false, (логическое) — Включает/выключает поддержку архивов.
Если установлено значение true, то при включенном ЧПУ (если в аргументе rewrite установлено значение true), URL архивов будет выглядеть так — site.ru/type.
Допустим, что имя регистрируемого типа записи ‘help’ — register_post_type('help',$args), то название файла шаблона должно быть archive-help.php, а URL архивов будет выглядеть так — site.ru/help
Если стоит задача сделать УРЛ отличным от имени регистрируемого типа записи, например site.ru/tips, то значение должно быть: 'has_archive' =>'tips', а файл-шаблон архивов должен называться archive-tips.php/
По умолчанию: false.
'permalink_epmask=> константа, (строка) — Задает маску постоянной ссылки. По смыслу схож с аргументом ep_mask из массива rewrite.
По умолчанию: EP_PERMALINK.
'query_var' => true, логическое/строка — Возможные значения true / false / строка. Ставим false, если хотим исключить возможность запроса на данный тип записи.
Для того, чтобы задать ключ, отличный от имени регистрируемого типа записи, то прописываем его так: 'query_var' => 'новый_ключ',.
Новый ключ добавиться в класс WP_Query, находящегося в глобальном объекте wp_query, откуда в последствии может запрашиваться различными функциями, например такими, как get_query_var().
По умолчанию: при значении true устанавливается имя регистрируемого типа записи ($post_type).
'register_meta_box_cb' => 'название_callback_функции' (callback) — Подключает пользовательскую callback функцию (функция обратного вызова), которая выводит дополнительные мета-блоки на страницу редактирования или создания регистрируемого типа записи.
Значения вывода стандартных мета-блоков задаются в массиве supports.
По умолчанию: нет.
'can_export' => true, (логическое) — Возможные значения true / false. Определяет включить/выключить возможность экспорта этого типа записи.
По умолчанию: true.
'capability_type' => 'маркер' (строка/массив) — Значение данного аргумента служит своего рода маркером для установки прав относительно регистрируемого типа записи.
Допускается передавать массив, например array('film', 'films'), где первое значение будет применяться для единственного числа, второе для множественного.
Аргумент capability_type применяется для построения списка прав, которые будут вписаны в массив значений аргумента capabilities.
По умолчанию: post.
'capability_type' => array('массив') (массив) — Массив прав пользователей для регистрируемого типа записей.
Допустим, что в значении аргумента capability_type установлен маркер array('film', 'films'). В этом случаи маркер автоматически впишется в массив capabilities, таким образом.
'capabilities' => array( 'edit_post' => 'edit_film', 'read_post' => 'read_film', 'delete_post' => 'delete_film', 'edit_posts' => 'edit_films', 'edit_others_posts' => 'edit_others_films', 'publish_posts' => 'publish_films', 'read_private_posts' => 'read_private_films', 'create_posts' => 'edit_films', ),
Мета права:
'edit_post' — редактирование записи;
'read_post' — прочтение записи;
'delete_post' — удаление записи;
Примитивные права:
'edit_posts' — редактирование объектов данного типа записи;
'edit_others_posts' — редактирование записей, принадлежащих другому пользователю;
publish_posts — публикация объектов типа записи;
read_private_posts — прочтение объектов данного типа записи.
Кроме того, есть еще восемь примитивных прав, не относящихся к ядру напрямую, но которые проверяются в функции map_meta_cap().
'read' — разрешает просмотр записей во фронт-энде;
'delete_posts' — разрешает удаление записей данного типа;
'delete_private_posts' — разрешение на удаление личных записей регистрируемого типа;
'delete_published_posts' — разрешение на удаление опубликованных записей;
'delete_others_posts' — разрешение на удаление записей других авторов;
'edit_private_posts' — разрешение на редактирование личных записей;
'edit_published_posts' — разрешение на редактирование опубликованных записей;
'create_posts' — разрешение на создание новых записей.
Данные права устанавливаются в автоматическом режиме, в том случаи, если в аргументе map_meta_cap задано значение true.
По умолчанию: массив строится исходя из значения аргумента capability_type.
'map_meta_cap' => false, (логическое) — Включает/отключает функцию map_meta_cap() (дефолтный обработчик специальных прав).
Данная функция преобразует неодназначные права (edit_post — одному пользователю разрешено, а другому нет) в примитивные права (edit_posts — всем пользователям разрешено).
По умолчанию: NULL.
show_in_rest (для разработчиков)
'show_in_rest' => false, (логическое) — Добавлять или не добавлять регистрируемый тип записи в REST API.
По умолчанию: false.
'rest_base' => 'имя_типа_записи' (строка) — Имя типа записи, которое будет доступно для запросов в REST API.
По умолчанию: $post_type.
rest_controller_class (для разработчиков)
'rest_controller_class' => 'контроллер' (строка) — Аргумент используется только в том случаи, если необходимо задействовать другой контроллер вместо WP_REST_Posts_Controller. Должен быть в подклассе WP_REST_Controller.
По умолчанию: WP_REST_Posts_Controller.
(для разработчиков)
'_builtin' => false (логическое) — Включать или не включать данный тип записи в зарезервированные типы, такие как: post, page, attachment, revision, nav_menu_item.
По умолчанию: false.
(для разработчиков)
'_edit_link' => 'post.php?post=%d' (логическое) — в качестве значения принимается часть URL, ведущего на страницу редактирования данного типа записи.
По умолчанию: 'post.php?post=%d'.
Функция возвращает: WP Post Type или WP_Error.
Хук register_post_type
У функции есть одноименный хук register_post_type, с помощью которого можно воздействовать как на произвольные типы записей, так и на стандартные: post, page и т.д.
Например, изменим название в меню для стандартного типа записи post. Вместо заголовка Записи выведем Публикации:
add_action('registered_post_type', 'mayak_menu_post_rename', 10, 2); function mayak_menu_post_rename($post_type, $args){ if ('post' === $post_type) { global $wp_post_types; $args->labels->menu_name = 'Публикации'; $wp_post_types[$post_type] = $args; } }
Вуаля:
Ничего сложного.
Пример подключения произвольного типа записи
Данную функцию надо вставить в файл functions.php, что находится в папке с темой после тега <?php:
add_action('init', 'mayak_type_post_register'); function mayak_type_post_register() { $labels = array( 'name' => 'Товар', 'singular_name' => 'Товар', 'add_new' => 'Добавить товар', 'add_new_item' => 'Добавить новый товар', 'edit_item' => 'Редактировать товар', 'new_item' => 'Новый товар', 'view_item' => 'Посмотреть товар', 'search_items' => 'Найти товар', 'not_found' => 'Товаров не найдено', 'not_found_in_trash' => 'В корзине товаров не найдено', 'menu_name' => 'Товар' ); $args = array( 'labels' => $labels, 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => true, 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array('title','editor','author','thumbnail','excerpt','comments','post-formats','custom-fields') ); register_post_type('product',$args); }
Это еще не все! Можно подредактировать служебные сообщения, которые отображаются при публикации или редактировании пользовательского типа записи.
Фильтр служебных сообщений
Функция вставляется в файл functions.php.
add_filter('post_updated_messages', 'mayak_notification'); function mayak_notification( $messages ) { global $post, $post_ID; $messages['product'] = array( 0 => '', // Оставить пустым! 1 => sprintf( 'Товар обновлен. <a href="%s">Посмотреть страницу товара</a>', esc_url( get_permalink($post_ID) ) ), 2 => 'Произвольное поле обновлено.', 3 => 'Произвольное поле удалено.', 4 => 'Запись товара обновлена.', 5 => isset($_GET['revision']) ? sprintf( 'Запись товара восстановлена из ревизии %s', wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, 6 => sprintf( 'Запись товара опубликована. <a href="%s">Перейти к записи товара</a>', esc_url( get_permalink($post_ID) ) ), 7 => 'Запись товара сохранена.', 8 => sprintf( 'Запись товара сохранена. <a target="_blank" href="%s">Предосмотр записи товара</a>', esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), 9 => sprintf( 'Запись товара запланирована на: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Предосмотр записи товара</a>', date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ), 10 => sprintf( 'Черновик записи товара обновлен. <a target="_blank" href="%s">Предосмотр записи товара</a>', esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ), ); return $messages; }
Не забудьте обновить настройки ЧПУ (Админка -> Настройки -> Постоянные ссылки)
В следующей статье мы будем регистрировать пользовательские таксономии для произвольных типов записей, так что подписывайтесь на обновления блога, будет интересно.
Таблица изменений
Версия | Дата | Описание |
---|---|---|
2.9.0 | 19.12.2009 | Внедрение. |
3.0.0 | 17.06.2010 | Расширено действие аргумента show_ui, теперь он распространяется на страницу редактирования записи. |
3.5.0 | 11.12.2012 | Введена возможность указывать логическое false для аргумента supports (отключает поле для ввода заголовка и редактор на странице редактирования записи). |
4.6.0 | 16.08.2016 | Изменена структура функции. Теперь возвращаемый объект типа post является экземпляром класса WP_Post_Type. |
4.7.0 | 06.12.2016 | Добавлены аргументы: view_items и attributes. Также введены аргументы: show_in_rest rest_base и rest_controller_class для регистрации типа записи в REST API. |
Файл: wp-includes/post.php (Развернуть)
Уф!… Так и не смог осилить. Обычно я стараюсь читаю статью до конца, для общего, так сказать, развития; даже если мне это сейчас, вроде как, и не нужно. Но в этом случае в конце концов прокрутил в конец (даже тафталогия получилась крутой). Но впечатляет! Одно понял: Ваше мыло у меня в личных записях, так скажем.
Очень сложная статья для понимания. Виталий, как-то надо упрощать)
Вы пишете:
Причина №3. Возможность создания отдельного шаблона (внешнего вида сайта) для страниц с произвольными типами записей, что конечно очень удобно.
Не понятно вы говорите об отдельном шаблоне для страниц или для записей? Я бы хотела, чтобы у созданного мною типа записей был свой шаблон. Как это можно сделать?
Юлия! Да тема не простая, но к тому же раскрыта она еще не полностью. В ближайшем времени выпущу статью, где расскажу, как создать отдельный шаблон для произвольных типов записей и как сделать для них отдельное меню.
Здравствуйте. Такой вопрос вот добавил я нужный пост тип в меню другого посттипа
‘show_in_menu’ => ‘edit.php?post_type=quotes’,
А теперь мне бы хотелось добавить еще туда кнопочку не просто просмотра записей но и добавления новой, как такое сделать?
Здравствуйте! На самой странице просмотра записи должна быть кнопка «Добавить новую».
Да это ясно, хотелось бы в меню слева тоже такую иметь…
Здравствуйте, Виталий!
У меня на сайте произвольные записи, практически являются «основными» (muzrestor.ru/?post_type=minus), но, как Вы смогли уже заметить, с самого начала их ссылки не являются постоянными. Когда их настраивали, я даже не знал, что это такое. Теперь их уже больше 1300, поэтому менять их на постоянные не решаюсь. Собственно проблема вот в чем:
Сделал микроразметку сайта (в том числе благодаря и Вашим кодам). Что бы она работала нормально, появилась необходимось вывода даты публикации постов. В стандартных постах ссылки этих дат редиректят на главную, а вот в произвольных, ссылки дат публикации выдают 404. Приходится каждый день в гугле отмечать их, как исправленные. Вы в этом плане «продвинутый» специалист. Может подскажете, как устранить проблемку? Буду очень благодарен.
С уважением, Александр.
Александр, вы уберите ссылку из даты публикации Зачем она Вам? Микроразметке это не помешает.
Спасибо, я уже думал об этом, но не очень понимаю, как это сделать.
Хоть удалить, хоть редирект -я не знаю, как это сделать именно в произвольных записях.
Александр, вы уберите ссылку из всех типов записей. Смотрите файл single.php или прикрепленный к нему файл, который отвечает за вывод цикла wordpress.
Ок, спасибо!
Убрал ссылки на дату во всех постах. Может на автора тоже стоит убрать? Или оставить, как есть, редирект на главную?
Я бы убрал.
Спасибо, Виталий!
Неплохо расписано, но вроде не нашел одной важной детали. Чтобы приведенный пример работал на сайте, нужно зайти в настройки — постоянные ссылки и просто нажать «сохранить изменения». Иначе движок не создаст правила для нового типа записей.
Спасибо мил человек, не могу полтора часа понять почему, при создании нового типа записи на сайте не работает его шаблон. Сделал как написано и все заработало