Типы постов
Урок 19
Типы постов (или типы записей) – это как раз то, что позволяет превратить WordPress из обычного блога во что угодно, серьёзно.
Реальный пример – плагин интернет-магазина WooCommerce использует типы записей для своих товаров.
То есть получается, что мы можем использовать типы записей для создания каких-либо сущностей контента, наравне с Записями и Страницами и настраивать их как хотим. Можем даже зарегистрировать тип записи, у котого не будет своих страниц на сайте, или наоборот – тип записи, который не будет отображаться в админке, но будет существовать и мы сможем использовать функции для работы с ним.
В этом видеоуроке я продолжу работать с нашей темой WordPress, над которой мы уже работаем на протяжении 18 уроков. В этот раз мы объединим знания нескольких предыдущих уроков и доработаем форму обратной связи, а именно – все заявки, отправленные формой будут не только высылаться по email, но также и сохраняться в админке сайта.
Чтобы скачать тему WordPress, которая получилась у нас в процессе этого урока, необходимо приобрести курс.
Если же вы не настроены на покупку курса, то ниже вас ждёт самый подробный урок про типы постов, который вы где-либо сможете найти.
Понять, что представляют из себя типы постов легче всего на примере. В WordPress по умолчанию (если вы не ставили никаких тем и плагинов) уже есть несколько типов постов:
post
)page
attachment
revision
nav_menu_item
custom_css
customize_changeset
Давайте вкратце рассмотрим каждый из стандартных типов постов, чтобы иметь общее представление о них.
Если на вашем сайте присутствует блог, то этот стандартный тип поста очень удобно использовать в качестве статей на блоге. Записи по умолчанию выводятся на главных страницах многих тем WordPress в порядке даты публикации (по убыванию). Они также попадают в RSS-ленту сайта.
В древние времена этот тип записи использовался также и для других сущностей. Например мы могли создавать в нём те же товары в интернет-магазине, но присваивать им другую рубрику или метку. Как хорошо, что это уже в прошлом!
Шаблоном страницы записи чаще всего используется файл темы single.php
. Кроме того, с версии 4.7 им включили поддержку произвольных шаблонов. Все остальные файлы используются более редко, но если интересне, вспоминаем иерархию.
О да! Страницы — это потрясающая штука! В целом они похожи на записи, но имеют несколько уникальных особенностей. Итак, страницы:
http://ваш-сайт.ru/ярлык_страницы
, например https://misha.agency/contacts
. Если имеются родительские элементы, они также будут включены в URL. Удобно.В качестве шаблона страницы чаще всего используется либо page.php
, либо {ваш_шаблон}.php
, остальные вариации менее редко, но они также описаны в уроке про иерархию.
Тип поста, предназначенный для управления файлами, загруженными через стандартный вордпрессовский загрузчик, а также для хранения информации о них.
Редакции записей — это черновики, которые автоматически сохраняются в процессе редактирования записей (также могут быть использованы и в других типах постов, не только в post
). И, если вы вдруг написали в своей статье что-то не то, вы всегда cможете восстановить её старую версию из одной из редакций.
Метабокс с редакциями вы найдёте на странице редактирования любой записи. В Gutenberg же – это отдельная вкладка в сайдбаре.
Если нв вашем сайте накапливаются десятки, сотни, ТЫСЯЧИ редакций, то вы можете их отключить или ограничить количество.
Данный тип постов хранит информацию об элементах навигации в WordPress.
Опция «Дополнительный стили» в кастомайзере появилась в версии WordPress 4.7 и позволяет прописать какой-то произвольный CSS для текущей темы.
Почему же для всего лишь одной опции создали ну целый тип записи? А потому что, сколько бы вы разных тем не устанавливали, стили, прописанные для каждой из них, будут сохраняться у вас в базе данных!
Не знаю, как можно перевести название этого типа записи, но нужен он для хранений сессий кастомайзера в базе данных WordPress.
Конечно же, самое интересное начинается, когда мы создаем собственный тип записей. Я уже поминал, что это может быть абсолютно, что угодно? Работы в портфолио, опросы, товары в интернет-магазине.
В видеоуроке я показываю, как добавить тип записей для хранения лидов, полученных через форму обратной связи. Мало ли, вдруг письмо не дойдёт или вы внезапно забудете пароль от своей почты.
Никогда! Не используйте плагины для регистрации типов записей.
Момент, о котором я решил сразу упомянуть. Знаю, что не так давно я высказывал недовольство от того, что для работы с произвольными полями люди используют плагин ACF и рекомендовал всем перейти на Carbon Fields. Так вот, с типами записей всё ещё гораздо гораздо печальнее. Ведь вся суть в том, что такие плагины, как acf или carbon fields хотя бы помогают вам сэкономить время на разработку метабоксов (про acf кстати не уверен, по факту гораздо больше времени потратил, тыкаясь в его интерфейсе). Если кодить метабоксы с нуля, то там действительно немало кода. Так вот, а в случае с произвольными типами постов мне вообще неясен смысл использования плагинов. Самый популярный вроде CPT UI.
Чуть ниже в первом шаге мы уже зарегистрируем тип записи и вы убедитесь в том, насколько это легко. Во втором-третьем шагах мы уже поговорим о дополнительной кастомизации.
Всё начинается с функции 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 ); }
Важно: в качестве имени типа поста (первый аргумент функции) нельзя использовать следующие слова: post
, page
, attachment
, revision
, nav_menu_item
, action
, order
, theme
. Помню случай, когда я пытался зарегистрировать тип поста order
и не мог понять, почему ничего не работает.
Ещё более супер важно – если ваш тип записи будет просматриваемым на сайте и использовать ЧПУ, то обязательно после его создания зайдите в Настройки > Постоянные ссылки и, не меняя даже ничего, нажмите кнопку сохранения изменений.
Этот пример очень упрощён. На моем блоге вы также найдете полную документацию функции register_post_type() с подробным описанием её параметров и их значений.
В рамках работы с нашей темой вставляйте код в functions.php
, а вообще читайте это.
В результате получаем:
Круто, да? Дальше вы уже можете приступать к работе с этим типом записей, а я ещё покажу несколько моментов его настройки.
В принципе обычно бывает достаточно первого шага, однако, если вы всерьез занялись настройкой админки, то остальные шаги тоже важны.
Наверное вы понимаете, о каких уведомлениях идет речь. Это сообщения, которые появляются в верхней части экрана при например сохранении или обновлении поста.
Если вы пропустите этот шаг, то по умолчанию будут использоваться уведомления из записей типа 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()
вряд ли у вас определена, её вы можете найти тут и нужна она для склонения слов.$bulk_messages[ 'lead' ]
– в качестве ключа этого массива указываем свой тип записи.Вкладка «Помощь» находится в правой верхней части экрана. Для нашего типа поста её ещё пока что нет, но вы сможете найти её на странице записей в админке например.
Да, содержимое этой вкладки мы тоже можем настроить. Это обычно бывает полезно при работе с клиентами, для которых админка WordPress нелегка в освоении. Туда можно добавить какую-нибудь справочную информацию и не только.
Что мы и сделаем:
Следующий код будет работать в версиях 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>' ) ); }
Про работу с колонками в админке у меня есть отдельный исчерпывающий урок. Сейчас же, в качестве примера, добавим ещё одну колонку, в которой будет выводиться текст сообщения лида.
Получится что-то в этом роде:
Код:
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; } } }
На этом с регистрацией и настройкой типа записи – всё! Дальше уже работаем с ним в рамках нашей задачи, например в этом видео – автоматически будем создавать посты при отправке формы пользователями.
Список уроков