Типы постов

Урок 19

Зарегистрируйтесь или войдите и получите бесплатный доступ к первым 3-м урокам курса.

Урок 19

Произвольные типы постов

Типы постов (или типы записей) – это как раз то, что позволяет превратить WordPress из обычного блога во что угодно, серьёзно.

Реальный пример – плагин интернет-магазина WooCommerce использует типы записей для своих товаров.

То есть получается, что мы можем использовать типы записей для создания каких-либо сущностей контента, наравне с Записями и Страницами и настраивать их как хотим. Можем даже зарегистрировать тип записи, у котого не будет своих страниц на сайте, или наоборот – тип записи, который не будет отображаться в админке, но будет существовать и мы сможем использовать функции для работы с ним.

В этом видеоуроке я продолжу работать с нашей темой WordPress, над которой мы уже работаем на протяжении 18 уроков. В этот раз мы объединим знания нескольких предыдущих уроков и доработаем форму обратной связи, а именно – все заявки, отправленные формой будут не только высылаться по email, но также и сохраняться в админке сайта.

Регистрируем тип записи для сохранения лидов с формы

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

Если же вы не настроены на покупку курса, то ниже вас ждёт самый подробный урок про типы постов, который вы где-либо сможете найти.

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

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

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

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

Записи

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

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

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

Шаблоном страницы записи чаще всего используется файл темы single.php. Кроме того, с версии 4.7 им включили поддержку произвольных шаблонов. Все остальные файлы используются более редко, но если интересне, вспоминаем иерархию.

Страницы

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

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

В качестве шаблона страницы чаще всего используется либо page.php, либо {ваш_шаблон}.php, остальные вариации менее редко, но они также описаны в уроке про иерархию.

Вложения

Тип поста, предназначенный для управления файлами, загруженными через стандартный вордпрессовский загрузчик, а также для хранения информации о них.

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

Редакции

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

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

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

Если нв вашем сайте накапливаются десятки, сотни, ТЫСЯЧИ редакций, то вы можете их отключить или ограничить количество.

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

Данный тип постов хранит информацию об элементах навигации в WordPress.

тип поста nav_menu_item в WordPress
На этом скриншоте мы можем увидеть двух представителей типа записи nav_menu_item – элементы меню «Главная» и «Блог».

Дополнительные стили

Опция «Дополнительный стили» в кастомайзере появилась в версии WordPress 4.7 и позволяет прописать какой-то произвольный CSS для текущей темы.

Тип поста дополнительные стили
Сам CSS, как вы возможно догадались, будет храниться в колонке post_content.

Почему же для всего лишь одной опции создали ну целый тип записи? А потому что, сколько бы вы разных тем не устанавливали, стили, прописанные для каждой из них, будут сохраняться у вас в базе данных!

Changesets

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

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

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

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

Никогда! Не используйте плагины для регистрации типов записей.

Момент, о котором я решил сразу упомянуть. Знаю, что не так давно я высказывал недовольство от того, что для работы с произвольными полями люди используют плагин ACF и рекомендовал всем перейти на Carbon Fields. Так вот, с типами записей всё ещё гораздо гораздо печальнее. Ведь вся суть в том, что такие плагины, как acf или carbon fields хотя бы помогают вам сэкономить время на разработку метабоксов (про acf кстати не уверен, по факту гораздо больше времени потратил, тыкаясь в его интерфейсе). Если кодить метабоксы с нуля, то там действительно немало кода. Так вот, а в случае с произвольными типами постов мне вообще неясен смысл использования плагинов. Самый популярный вроде CPT UI.

Чуть ниже в первом шаге мы уже зарегистрируем тип записи и вы убедитесь в том, насколько это легко. Во втором-третьем шагах мы уже поговорим о дополнительной кастомизации.

1. register_post_type()

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

add_action( 'init', 'true_register_post_type_init' );
 
function true_register_post_type_init() {
 
	$labels = array(
		'name' => 'Лиды',
		'singular_name' => 'Лид',
		'add_new' => 'Добавить лид',
		'add_new_item' => 'Добавить лид',
		'edit_item' => 'Редактировать лид',
		'new_item' => 'Новый лид',
		'all_items' => 'Все лиды',
		'search_items' => 'Искать лиды',
		'not_found' =>  'Лидов по заданным критериям не найдено.',
		'not_found_in_trash' => 'В корзине нет лидов.',
		'menu_name' => 'Лиды'
	);
 
	$args = array(
		'labels' => $labels,
		'public' => true,
		'publicly_queryable' => false,
		'has_archive' => false,
		'menu_icon' => 'dashicons-email-alt2',
		'menu_position' => 2,
		'supports' => array( 'title', 'editor' )
	);
 
	register_post_type( 'lead', $args );
}

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

Ещё более супер важно – если ваш тип записи будет просматриваемым на сайте и использовать ЧПУ, то обязательно после его создания зайдите в Настройки > Постоянные ссылки и, не меняя даже ничего, нажмите кнопку сохранения изменений.

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

В рамках работы с нашей темой вставляйте код в functions.php, а вообще читайте это.

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

Зарегистрировали тип записи WordPress

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

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

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

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

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

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

add_filter( 'post_updated_messages', 'true_post_type_messages' );
 
function true_post_type_messages( $messages ) {
 
	global $post, $post_ID;
 
	$messages[ 'lead' ] = array( // lead - название созданного нами типа записей
		0 => '', // Данный индекс не используется.
		1 => 'Лид обновлён.',
		2 => 'Поле изменено.',
		3 => 'Поле удалено.',
		4 => 'Лид обновлён.',
		5 => isset( $_GET[ 'revision' ] ) ? sprintf( 'Лид восстановлен из редакции из редакции: %s', wp_post_revision_title( (int) $_GET[ 'revision' ], false ) ) : false,
		6 => 'Лид добавлен.',
		7 => 'Лид сохранён.',
		8 => 'Отправлено на проверку.',
		9 => sprintf( 'Лид запланирован на публикацию на <strong>%1$s</strong>.', date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ) ),
		10 => 'Черновик лида сохранён',
	);
 
	return $messages;
}

Кроме того, есть ещё сообщения быстрого редактирования постов. Вот о чём я говорю:

Изменяем сообщения массивого редактирования типа записей

Их тоже можно подкорректировать при помощи хуков, а конкретнее – при помощи bulk_post_updated_messages.

add_filter( 'bulk_post_updated_messages', 'true_bulk_post_updated_messages', 25, 2 );
 
function true_bulk_post_updated_messages( $messages, $counts ) {
 
	$bulk_messages[ 'lead' ] = array(
		// не совсем правильный способ, но уже полностью рабочий прямо сейчас
		'updated'   => $counts[ 'updated' ] . ' ' . true_wordform( $counts[ 'updated' ], 'лид', 'лида', 'лидов') . ' обновлено.',
		'locked'    => $counts[ 'locked' ] . ' ' . true_wordform( $counts[ 'locked' ], 'лид', 'лида', 'лидов') . ' не обновлено, потому что кто-то редактирует их.',
		'deleted'   => $counts[ 'deleted' ] . ' ' . true_wordform( $counts[ 'deleted' ], 'лид', 'лида', 'лидов') . ' удалено безвозвратно.',
		'trashed'   => $counts[ 'deleted' ] . ' ' . true_wordform( $counts[ 'deleted' ], 'лид', 'лида', 'лидов') . ' перемещено в корзину.',
		// правильный способ, это когда наш код поддерживает локализацию
		// но при написание чего-либо для себя, возможно в этом и нет большого смысла
		'untrashed' => _n( '%s lead restored from the Trash.', '%s leads restored from the Trash.', $bulk_counts[ 'untrashed' ] ),
	);
 
	return $bulk_messages;
 
}

Несколько важных моментов по коду сразу:

  • Функция true_wordform() вряд ли у вас определена, её вы можете найти тут и нужна она для склонения слов.
  • Однако это не совсем правильный способ, особенно, если вы пишете плагин или тему не для какого-то определённого клиента или для себя, а для людей. В таком случае ваш код должен поддерживать локализацию этих строк и использовать функцию _n().
  • $bulk_messages[ 'lead' ] – в качестве ключа этого массива указываем свой тип записи.

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

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

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

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

Что мы и сделаем:

добавление вкладки при помощи метода add_help_tab()

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

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

4. Колонки в таблице со списком постов произвольного типа

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

Получится что-то в этом роде:

дополнительные колонки на страницах с типами записей в админке

Код:

add_filter( 'manage_edit-lead_columns', 'true_add_lead_columns', 25 );
 
function true_add_lead_columns( $columns ){
 
	$message = array( 'message' => 'Сообщение' );
 	$columns = array_slice( $columns, 0, 2, true ) + $message + array_slice( $columns, 2, NULL, true );
 
	return $columns;
 
}
 
add_action( 'manage_posts_custom_column', 'true_fill_lead_columns', 25 );
 
function true_fill_lead_columns( $column ) {
 
	switch ( $column ) {
		case 'message': {
			global $post;
			echo wpautop( esc_html( $post->post_content ) );
			break;
		}
	}
 
}

На этом с регистрацией и настройкой типа записи – всё! Дальше уже работаем с ним в рамках нашей задачи, например в этом видео – автоматически будем создавать посты при отправке формы пользователями.

Купить курс
  • 21 видеоурок
  • Можно скачать готовый код после каждого урока
  • Уроки актуальны под последние версии WordPress
  • Можно начать проходить курс сразу же после оплаты
  • Достаточно базовых знаний HTML и CSS, чтобы пройти курс
  • Доступ навсегда
  • Единоразовый платёж
5000 р

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