» » » Функция register_post_type() — произвольные типы записей WordPress
logotip

Функция register_post_type() — произвольные типы записей WordPress

Всем привет! Сегодня на seo-mayak.com мы будем учится создавать произвольные типы записей на CMS WordPress.

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

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

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

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

proizvolnye tipy zapisei

Произвольные типы записей конечно не новость. На данную тему написано не мало трудов, как поверхностных, так и глубоких. Меня же сподвигло на написание данного поста простое обстоятельство — подумываю создать на seo-mayak.com новый раздел.

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

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

Для чего нужны произвольные типы записей

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

На самом деле все просто. В админке, на панели слева, создается новая вкладка с произвольным названием, например:

proizvolnye tipy zapisei

Данный тип записи будет иметь тот же набор инструментов, что и стандартная запись.

Конечно возникнет вопрос. Для чего же тогда надо создавать этот, своего рода, дубль стандартных записей?

Здесь можно назвать три основные причины.

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

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

Причина №2. Превью данных постов не будут отображаться в основной RSS ленте, а при желании для них можно создать отдельный RSS канал и отдельную подписку.

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

Причина №3. Возможность создания отдельного шаблона (внешнего вида сайта) для страниц с произвольными типами записей, что конечно очень удобно.

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

Функция register_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' => 'Посмотреть шпаргалку',
	        '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. Здесь мы задаем заголовок для страницы создания/редактирования регистрируемого типа записи:

proizvolnye tipy zapisei-5

По умолчанию: значение аргумента label.


singular_name

'singular_name' => 'Шпаргалку' — Тут все зависит от Имени типа записи и от того склоняется оно или нет (смотрите скриншот):

proizvolnye tipy zapisei-10.1

По умолчанию: последовательная цепочка значений аргументов name -> label.

menu_name

'menu_name' => 'Шпаргалки' — Выводит заголовок меню нового типа записи в админке на панели слева:

proizvolnye tipy zapisei-33

По умолчанию: последовательная цепочка значений аргументов name -> label.


all_items

'all_items' => 'Все Шпаргалки' — Выводит вкладку управления новыми типами записей в подменю:

proizvolnye tipy zapisei-34

По умолчанию: последовательная цепочка значений аргументов menu_name -> name -> label.


add_new

'add_new' => 'Добавить свежую' — Выводит вкладку управления новыми типами записей в подменю:

proizvolnye tipy zapisei-35

По умолчанию: текст из меню зарезервированного типа записи «post» — «Добавить новую».


add_new_item

'add_new_item' => 'Добавить свежую шпаргалку' — при добавлении новой записи, на странице в админке будет выведен соответствующий заголовок:

proizvolnye tipy zapisei-12.1

По умолчанию: текст «Добавить запись».


edit_item

'edit_item' => 'Редактировать шпаргалку' — Данный заголовок будет выведен на страницу при редактировании записи произвольного типа:

proizvolnye tipy zapisei-13

Тот же текст будет выведен в меню быстрого доступа непосредственно на самой странице:

proizvolnye tipy zapisei-14

По умолчанию: текст «Редактировать запись».


view_item

'view_item' => 'Посмотреть шпаргалку' — Это уведомление появится в админке, в меню быстрого доступа:

proizvolnye tipy zapisei-15

По умолчанию: текст «Посмотреть запись».


search_items

'not_found' => 'Найти шпаргалку' — Текст для кнопки поиска в админке:

proizvolnye tipy zapisei-3

По умолчанию: текст «Поиск записей».


not_found

'not_found' => 'Шпаргалок не найдено' — Текст сообщения при отсутствии записей и если запись не будет найдена через поиск:

proizvolnye tipy zapisei-4

По умолчанию: текст «Записей не найдено».


not_found_in_trash

'not_found_in_trash' => 'В корзине шпаргалок не найдено' — Данное уведомление отобразится при пустой корзине:

proizvolnye tipy zapisei-2

По умолчанию: текст «Записей в корзине не найдено».


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', который выводит блок «Атрибуты».

proizvolnye tipy zapisei-22

Данный блок предназначен только для страниц типа page, которые могут иметь древовидную структуру (страницы и подстраницы), а также в данном блоке можно выбрать шаблон для страницы. Понятно, что такой блок не подойдет для страниц типа single. Чуть ниже я еще вернусь к этой теме.

Древовидная структура страниц будет работать только в том случаи, если у аргумента hierarchical будет установлено значение true!

Дополнительно все блоки включить или отключить можно в интерфейсе «Настройки экрана»:

proizvolnye tipy zapisei-23

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

Массив $rewrite

'rewrite' => true, — Включает/отключает ЧПУ для регистрируемого типа записи. При значении false ЧПУ отключены.

Если установить значение true, в массив по умолчанию будут включены следующие значения:


sung

'sung' => 'new prefix', — Создает префикс для ЧПУ site.ru/префикс/ярлык_записи. Чтобы создать свой префикс, используйте конструкцию array( 'slug' => 'new prefix').

По умолчанию: Имя типа записи (post-type).


with_front

'with_front' => true, — Возможные значения true / false. Определяет вставлять (true) или не вставлять (false) в URL общий префикс из настроек.

Допустим, что структура ЧПУ записей у нас выглядит так — blog/%postname%, тогда при значении true префикс добавляется и URL будет таким — site.ru/blog/help/название_поста, а при значении false URL будет следующим — site.ru/help/название_поста.

По умолчанию: true.


feeds

'feeds' => true, — Возможные значения true / false. Определяет добавлять (true) или не добавлять (false) правило ЧПУ для регистрируемого типа записи.

По умолчанию: значение аргумента has_archive.


pages

'pages' => true, — Возможные значения true / false. Определяет добавлять (true) или не добавлять (false правило ЧПУ для страниц пагинации регистрируемого типа записи.

По умолчанию: значение аргумента true.


ep_mask

'ep_mask' => константа, — Перезаписывает маску постоянной ссылки (только для опытных). Все константы масок можно посмотреть wp-includes/rewrite.php.

По умолчанию: константа EP_PERMALINK.

Аргументы массива $args


label

'label' => 'shpargalki' — Ярлык произвольного типа записи (необязательно).

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

По умолчанию: значение $post_type.



public

'public' => true, — Аргумент может принимать два логических значения: true (истина) или false (ложь).

Определяет включать значение аргумента view_item в меню быстрого доступа или не включать:

proizvolnye tipy zapisei-26

В произвольное меню:

proizvolnye tipy zapisei-36

Также значения данного аргумента включают/отключают вывод блока «Постоянная ссылка»:

proizvolnye tipy zapisei-27

Это значит, что при значении false страница будет отдавать ошибку 404.

Важно! Значения аргумента public оказывают прямое влияние на значения по умолчанию таких аргументов, как: publicly_queryable, exclude_from_search и show_ui.

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



publicly_queryable

'publicly_queryable' => true, — Возможные значения true / false. Включает/отключает вывод блока «Постоянная ссылка», а также включает/отключает вывод кнопки «Посмотреть изменения»:

proizvolnye tipy zapisei-30

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

По умолчанию: значение аргумента public.


exclude_from_search

'exclude_from_search' => true, — Возможные значения true / false. Включает/исключает страницы данного типа из общего поиска по сайту (true — участвуют в поиске, false — не участвуют в поиске).

По умолчанию: обратное значение аргумента public.



show_ui

'show_ui' => true, — Возможные значения true / false. Выводит/убирает меню управления данным типом записи, что расположено в админке на панели слева (true — показывать меню, false — не показывать меню).

По умолчанию: значение аргумента public.



show_in_menu

'show_in_menu' => true, — Возможные значения true / false / строка. Выводит меню управления данным типом записи в админку на панель слева (true — показывать меню, false — не показывать меню, строка — выводить как подменю).

Важно! Значение атрибута show_ui должно быть установлено, как true, иначе любые значения атрибута show_in_menu будут игнорироваться.

Если со значениями true и false должно быть все понятно, то со значением строка надо разобраться.

Конечно строка — это условное обозначение, на самом деле сюда вписывается часть урла административных страниц, на которые ведут вкладки: записи, страницы, медиафайлы и т.д.

Например, если мы для атрибута show_in_menu зададим строковое значение 'edit.php', то получим меню 2 уровня (подменю):

proizvolnye tipy zapisei-31

Все возможные строковые значения атрибута 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

'show_in_admin_bar' => true, — Возможные значения true / false. Определяет добавлять или не добавлять данные регистрируемого типа записи в меню быстрого доступа (админ-бар).

По умолчанию: значение аргумента show_in_menu.


menu_position

'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

'menu_icon' => 'dashicons-plus-alt' — Выводит иконку для произвольного типа записи:

proizvolnye tipy zapisei-32

С выходом WordPress 3.8 разработчики добавили внушительный пакет иконок. Все иконки можно посмотреть здесь.

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

По умолчанию: dashicons-admin-post.



show_in_nav_menus

'show_in_nav_menus' => true, — Возможные аргументы true / false. Определяет включать или не включать регистрируемый тип записи в произвольное меню.

По умолчанию: значение аргумента public.



hierarchical

'hierarchical' => false, — Возможные значения true / false.

Определяет какую структуру будет иметь данный тип записи: true — древовидную (страницы/подстраницы) или false — таксономическую (категории/подкатегории).

При значении true, в массив supports надо добавить аргумент page-attributes!

По умолчанию: false.



taxonomies

'taxonomies' => array(), — подключает новый тип записей к уже зарегистрированным таксономиям (подробней о таксономиях тут).

Т.е, если мы хотим, чтобы посты из нового типа были связанны зарегистрированными таксономиями, то в данном параметре надо их перечислить. Например: 'taxonomies' => array('category','post_tag').

По умолчанию: нет.



has_archive

'has_archive' => false, — Возможные значения true / 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

'permalink_epmask=> константа, — Задает маску постоянной ссылки. По смыслу схож с аргументом ep_mask из массива rewrite.

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



query_var

'query_var' => true, — Возможные аргументы true / false / строка. Ставим false, если хотим исключить возможность запроса на данный тип записи.

Для того, чтобы задать ключ, отличный от имени регистрируемого типа записи, то прописываем его так: 'query_var' => 'новый_ключ',.

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

По умолчанию: при значении true устанавливается имя регистрируемого типа записи ($post_type).



register_meta_box_cb

'register_meta_box_cb' => 'название_callback_функции' — Подключает пользовательскую callback функцию (функция обратного вызова), которая выводит дополнительные мета-блоки на страницу редактирования или создания регистрируемого типа записи.

Значения вывода стандартных мета-блоков задаются в массиве supports.

По умолчанию: нет.



can_export

'can_export' => true, — Возможные значения true / false. Определяет включить/выключить возможность экспорта этого типа записи.

По умолчанию: true.



capability_type

'capability_type' => 'маркер' — Значение данного аргумента служит своего рода маркером для установки прав относительно регистрируемого типа записи.

Допускается передавать массив, например array('film', 'films'), где первое значение будет применяться для единственного числа, второе для множественного.

Аргумент capability_type применяется для построения списка прав, которые будут вписаны в массив значений аргумента capabilities.

Если устанавливается пользовательский маркер, отличный от значений 'post' или 'page;', тогда в аргументе map_meta_cap надо установить значение true.

По умолчанию: post.



capabilities

'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

'map_meta_cap' => false, — Возможные значения true / false. Включает/отключает функцию map_meta_cap() (дефолтный обработчик специальных прав).

Данная функция преобразует неодназначные права (edit_post — одному пользователю разрешено, а другому нет) в примитивные права (edit_posts — всем пользователям разрешено).

По умолчанию: NULL.



show_in_rest (для разработчиков)

'show_in_rest' => false,— Возможные значения true / false — Добавлять или не добавлять регистрируемый тип записи в REST API.

По умолчанию: false.



rest_base

'rest_base' => 'имя_типа_записи' — Имя типа записи, которое будет доступно для запросов в REST API.

По умолчанию: $post_type.



rest_controller_class (для разработчиков)

'rest_controller_class' => 'контроллер' — Аргумент используется только в том случаи, если необходимо задействовать другой контроллер вместо WP_REST_Posts_Controller. Должен быть в подклассе WP_REST_Controller.

По умолчанию: WP_REST_Posts_Controller.


(для разработчиков)


_builtin

'_builtin' => false — Включать или не включать данный тип записи в зарезервированные типы, такие как: post, page, attachment, revision, nav_menu_item.

По умолчанию: false.

(для разработчиков)


_edit_link

'rest_controller_class' => 'post.php?post=%d' — в качестве значения принимается часть URL, ведущего на страницу редактирования данного типа записи.

По умолчанию: 'post.php?post=%d'.

Пример функции для вставки в шаблон

Данную функцию надо вставить в файл 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;
}

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

До встречи!

С уважением, Виталий Кириллов

(предыдущая статья)

Комментарии: 15

  1. Сергей:

    Уф!… Так и не смог осилить. Обычно я стараюсь читаю статью до конца, для общего, так сказать, развития; даже если мне это сейчас, вроде как, и не нужно. Но в этом случае в конце концов прокрутил в конец (даже тафталогия получилась крутой). Но впечатляет! Одно понял: Ваше мыло у меня в личных записях, так скажем.

    Ответить
  2. Юлия:

    Очень сложная статья для понимания. Виталий, как-то надо упрощать)
    Вы пишете:
    Причина №3. Возможность создания отдельного шаблона (внешнего вида сайта) для страниц с произвольными типами записей, что конечно очень удобно.
    Не понятно вы говорите об отдельном шаблоне для страниц или для записей? Я бы хотела, чтобы у созданного мною типа записей был свой шаблон. Как это можно сделать?

    Ответить
    • Виталий Кириллов:

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

      Ответить
  3. Kiran:

    Здравствуйте. Такой вопрос вот добавил я нужный пост тип в меню другого посттипа
    ‘show_in_menu’ => ‘edit.php?post_type=quotes’,
    А теперь мне бы хотелось добавить еще туда кнопочку не просто просмотра записей но и добавления новой, как такое сделать?

    Ответить
    • Виталий Кириллов:

      Здравствуйте! На самой странице просмотра записи должна быть кнопка «Добавить новую».

      Ответить
      • Kiran:

        Да это ясно, хотелось бы в меню слева тоже такую иметь…

        Ответить
  4. Александр:

    Здравствуйте, Виталий!
    У меня на сайте произвольные записи, практически являются «основными» (muzrestor.ru/?post_type=minus), но, как Вы смогли уже заметить, с самого начала их ссылки не являются постоянными. Когда их настраивали, я даже не знал, что это такое. Теперь их уже больше 1300, поэтому менять их на постоянные не решаюсь. Собственно проблема вот в чем:
    Сделал микроразметку сайта (в том числе благодаря и Вашим кодам). Что бы она работала нормально, появилась необходимось вывода даты публикации постов. В стандартных постах ссылки этих дат редиректят на главную, а вот в произвольных, ссылки дат публикации выдают 404. Приходится каждый день в гугле отмечать их, как исправленные. Вы в этом плане «продвинутый» специалист. Может подскажете, как устранить проблемку? Буду очень благодарен.
    С уважением, Александр.

    Ответить
    • Виталий Кириллов:

      Александр, вы уберите ссылку из даты публикации Зачем она Вам? Микроразметке это не помешает.

      Ответить
      • Александр:

        Спасибо, я уже думал об этом, но не очень понимаю, как это сделать.

        Ответить
      • Александр:

        Хоть удалить, хоть редирект -я не знаю, как это сделать именно в произвольных записях.

        Ответить
        • Виталий Кириллов:

          Александр, вы уберите ссылку из всех типов записей. Смотрите файл single.php или прикрепленный к нему файл, который отвечает за вывод цикла wordpress.

          Ответить
          • Александр:

            Ок, спасибо!

            Ответить
          • Александр:

            Убрал ссылки на дату во всех постах. Может на автора тоже стоит убрать? Или оставить, как есть, редирект на главную?

            Ответить
            • Виталий Кириллов:

              Я бы убрал.

              Ответить
              • Александр:

                Спасибо, Виталий!

                Ответить

Оставить комментарий

Внимание комментатор! Прежде чем вставить: HTML, JavaScript или PHP код в свой комментарий, преобразуй его в html сущность!

Subscribe without commenting

» Подписаться на комментарии по RSS