Типы постов в WordPress. Добавление собственных произвольных типов постов.

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

Почему раньше WordPress называли движком только для блогов? Потому что раньше в нем не было типов записей (на самом деле некоторые люди с сайтами на джумле до сих пор упрямо считают, что удел WP — блоги, но мы все прекрасно знаем, что это далеко не так).

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

Также вы можете глянуть этот обзорный видеоурок:

Стандартные типы записей WordPress

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

  • Записи (каждый тип поста имеет отдельное название для использования в коде, у записей это post)
  • Страницы page
  • Вложения attachment
  • Редакции revision
  • Элементы меню nav_menu_item

Что общего у всех этих типов? Все они являются элементами содержимого сайта, имеют какие-либо параметры. Информацию о них можно получить или вывести, например в виде объекта поста WP_Post.

Давайте вкратце рассмотрим каждый из стандартных типов постов, чтобы иметь общее представление о них.

Записи

Если на вашем сайте присутствует блог, то этот стандартный тип поста очень удобно использовать в качестве статей на блоге. Записи по умолчанию выводятся на главных страницах многих тем WordPress в порядке даты публикации (по убыванию). Они также попадают в RSS-ленту сайта.

тип постов Записи

Шаблоном страницы записи является файл темы single.php.

Страницы

О да! Страницы — это потрясающая штука! В целом они похожи на записи, но имеют несколько уникальных особенностей. Итак, страницы:

тип постов Страницы
  • Первое и самое главное — страницы могут использовать произвольный файл из папки с темой в качестве своего HTML/PHP шаблона. Это значит, что в принципе каждая страница может кардинально отличаться от общего дизайна и верстки сайта. Но на самом деле, с версии 4.7 мы можем использовать шаблоны страниц для любого типа поста.
  • Имеют иерархию. Т.е. одна страница может быть родительской для других страниц.
  • Имеется возможность сортировать их по порядку. В принципе каждый тип поста имеет такую возможность, но в страницах этот функционал предусмотрен по умолчанию.
  • При включенных постоянных ссылках на сайте, страницы имеют URL вида http://ваш-сайт.ru/ярлык_страницы, например https://misha.blog/contacts. Если имеются родительские элементы, они также будут включены в URL. Удобно.

В качестве шаблона страницы может быть задействован один из следующих файлов. Файлы указаны в порядке приоритета задействования. Т.е., если файла под номером 1 не существует, то будет задействован файл под номером 2.

  1. {ваш_шаблон}.php файл с произвольным названием, будет использоваться как шаблон страницы, если выбран на странице редактирования страницы.
  2. page-{ярлык_страницы}.php
  3. page-{ID_страницы}.php
  4. page.php

Вложения

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

тип поста Вложения

Редакции

Редакции записей — это черновики, которые автоматически сохраняются в процессе редактирования записей (также могут быть использованы и в других типах постов, не только в post). И, если вы вдруг написали в своей статье что-то не то, вы всегда cможете восстановить её старую версию из одной из редакций.

тип поста Редакции

Метабокс с редакциями вы найдёте на странице редактирования любой записи.

Элементы меню

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

Регистрация пользовательского типа поста

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

В качестве примера давайте добавим «Функции WordPress». То есть, нам нужно, чтобы у функций был собственный шаблон страниц, собственные категории, ну, и если мы будем постить по 3 функции в день (к примеру), то нам тем более не надо захламлять RSS-канал.

Всего будет 4 шага создания типа поста. На самом деле, чтобы всё заработало, достаточно и одного-двух этапов, но нам ведь надо, чтобы всё было на высшем уровне.

Шаг 1. register_post_type()

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

add_action( 'init', 'true_register_post_type_init' ); // Использовать функцию только внутри хука init
 
function true_register_post_type_init() {
	$labels = array(
		'name' => 'Функции',
		'singular_name' => 'Функцию', // админ панель Добавить->Функцию
		'add_new' => 'Добавить функцию',
		'add_new_item' => 'Добавить новую функцию', // заголовок тега <title>
		'edit_item' => 'Редактировать функцию',
		'new_item' => 'Новая функция',
		'all_items' => 'Все функции',
		'view_item' => 'Просмотр функции на сайте',
		'search_items' => 'Искать функции',
		'not_found' =>  'Функций не найдено.',
		'not_found_in_trash' => 'В корзине нет функций.',
		'menu_name' => 'Кодекс WP' // ссылка в меню в админке
	);
	$args = array(
		'labels' => $labels,
		'public' => true,
		'show_ui' => true, // показывать интерфейс в админке
		'has_archive' => true, 
		'menu_icon' => get_stylesheet_directory_uri() .'/img/function_icon.png', // иконка в меню
		'menu_position' => 20, // порядок в меню
		'supports' => array( 'title', 'editor', 'comments', 'author', 'thumbnail')
	);
	register_post_type('functions', $args);
}

Важно: в качестве имени типа поста (первый аргумент функции) нельзя использовать следующие слова: post, page, attachment, revision, nav_menu_item, action, order, theme. Помню случай, когда я пытался зарегистрировать тип поста order и не мог понять, почему ничего не работает.

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

Если не знаете, куда вставлять код из этого поста, вставляйте всё в файл functions.php. Таких файлов может быть несколько, нам нужен тот, который находится непосредственно в папке с текущей темой.

В результате получаем:

Результат действия функции register_post_type()

Круто, да?

Шаг 2. Тексты уведомлений для типа постов

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

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

Сообщение, появляющееся при обновлении поста данного типа

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

add_filter( 'post_updated_messages', 'true_post_type_messages' );
 
function true_post_type_messages( $messages ) {
	global $post, $post_ID;
 
	$messages['functions'] = array( // functions - название созданного нами типа записей
		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;
}

Шаг 3. Вкладка «Помощь»

Вкладка «Помощь» находится в правой верхней части экрана. Для нашего типа поста её ещё пока что нет, но вы сможете найти её на странице редактирования записей например.

вкладка Помощь в верхней правой части экрана

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

Следующий код будет работать в версиях WordPress 3.3 и выше. Более старые версии WordPress в данном случае рассматривать не вижу смысла.

function true_post_type_help_tab() {
 
	$screen = get_current_screen();
 
	// Прекращаем выполнение функции, если находимся на страницах других типов постов
	if ( 'functions' != $screen->post_type )
		return;
 
	// Массив параметров для первой вкладки
	$args = array(
		'id'      => 'tab_1',
		'title'   => 'Обзор',
		'content' => '<h3>Обзор</h3><p>Содержимое первой вкладки.</p>'
	);
 
	// Добавляем вкладку
	$screen->add_help_tab( $args );
 
	// Массив параметров для второй вкладки
	$args = array(
		'id'      => 'tab_2',
		'title'   => 'Доступные действия',
		'content' => '<h3>Доступные действия с типом постов &laquo;' . $screen->post_type . '&raquo;</h3><p>Содержимое второй вкладки</p>'
	);
 
	// Добавляем вторую вкладку
	$screen->add_help_tab( $args );
 
}
 
add_action('admin_head', 'true_post_type_help_tab');

При использовании этого кода получаем:

содержимое вкладки Помощь

Шаг 4. Обновление постоянных ссылок

Завершающий штрих. Если на вашем сайте включены пермалинки, то, для того, чтобы страницы типа поста корректно отображались (и отображались вообще), переходим в Параметры > Постоянные ссылки и, ничего не меняя, нажимаем «Сохранить изменения».

Миша Рудрастых Разработчик WordPress WooCommerce

Миша Рудрастых

Впервые познакомился с WordPress в 2009 году, и после двух лет мучений с Joomla и самописными движками это был просто бальзам на душу. С 2014 года меня можно встретить на WordCamp — официальной конфе по WP в Москве, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills в Питере.

Смотрите также