Вот мы наконец-то и добрались до такой важнейшей темы, как вордпрессовские типы постов (или типы записей). Нет, серьёзно, если ваш сайт представляет из себя чуть больше, чем просто блог, то умение обращаться с типами постов просто необходимо.
Почему раньше WordPress называли движком только для блогов? Потому что раньше в нем не было типов записей (на самом деле некоторые люди с сайтами на джумле до сих пор упрямо считают, что удел WP — блоги, но мы все прекрасно знаем, что это далеко не так).
Если вы уже более или менее знакомы с типами постов в WordPress и их созданием, читайте про их вывод в цикле в статье про WP_Query и про файлы темы, используемые для них в качестве шаблонов.
Также вы можете глянуть этот обзорный видеоурок:
Понять, что представляют из себя типы постов легче всего на примере. В WordPress по умолчанию (если вы не ставили никаких тем и плагинов) уже есть несколько типов постов:
post
)page
attachment
revision
nav_menu_item
Что общего у всех этих типов? Все они являются элементами содержимого сайта, имеют какие-либо параметры. Информацию о них можно получить или вывести, например в виде объекта поста WP_Post.
Давайте вкратце рассмотрим каждый из стандартных типов постов, чтобы иметь общее представление о них.
Если на вашем сайте присутствует блог, то этот стандартный тип поста очень удобно использовать в качестве статей на блоге. Записи по умолчанию выводятся на главных страницах многих тем WordPress в порядке даты публикации (по убыванию). Они также попадают в RSS-ленту сайта.
Шаблоном страницы записи является файл темы single.php
.
О да! Страницы — это потрясающая штука! В целом они похожи на записи, но имеют несколько уникальных особенностей. Итак, страницы:
http://ваш-сайт.ru/ярлык_страницы
, например https://misha.agency/contacts
. Если имеются родительские элементы, они также будут включены в URL. Удобно.В качестве шаблона страницы может быть задействован один из следующих файлов. Файлы указаны в порядке приоритета задействования. Т.е., если файла под номером 1 не существует, то будет задействован файл под номером 2.
{ваш_шаблон}.php
файл с произвольным названием, будет использоваться как шаблон страницы, если выбран на странице редактирования страницы.page-{ярлык_страницы}.php
page-{ID_страницы}.php
page.php
Тип поста, предназначенный для управления файлами, загруженными через стандартный вордпрессовский загрузчик, а также для хранения информации о них. Например у изображений это может быть их размер, альтернативный текст (для HTML-атрибута alt) и т.д.
Редакции записей — это черновики, которые автоматически сохраняются в процессе редактирования записей (также могут быть использованы и в других типах постов, не только в post
). И, если вы вдруг написали в своей статье что-то не то, вы всегда cможете восстановить её старую версию из одной из редакций.
Метабокс с редакциями вы найдёте на странице редактирования любой записи.
Данный тип постов хранит информацию об элементах навигации в WordPress. Кстати, это единственный тип, который не используется для работы с контентом сайта.
Конечно же, самое интересное начинается, когда мы создаем собственный тип записей. Причем это может быть абсолютно что угодно, например работы в портфолио, опросы, товары в интернет-магазине.
В качестве примера давайте добавим «Функции WordPress». То есть, нам нужно, чтобы у функций был собственный шаблон страниц, собственные категории, ну, и если мы будем постить по 3 функции в день (к примеру), то нам тем более не надо захламлять RSS-канал.
Всего будет 4 шага создания типа поста. На самом деле, чтобы всё заработало, достаточно и одного-двух этапов, но нам ведь надо, чтобы всё было на высшем уровне.
Всё начинается с функции 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
. Таких файлов может быть несколько, нам нужен тот, который находится непосредственно в папке с текущей темой.
В результате получаем:
Круто, да?
В принципе обычно бывает достаточно первого и четвертого шага, однако, если вы всерьез занялись настройкой админки, то шаги 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; }
Вкладка «Помощь» находится в правой верхней части экрана. Для нашего типа поста её ещё пока что нет, но вы сможете найти её на странице редактирования записей например.
Да, содержимое этой вкладки мы тоже можем настроить. Это обычно бывает полезно при работе с клиентами, для которых админка 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>Доступные действия с типом постов «' . $screen->post_type . '»</h3><p>Содержимое второй вкладки</p>' ); // Добавляем вторую вкладку $screen->add_help_tab( $args ); } add_action('admin_head', 'true_post_type_help_tab');
При использовании этого кода получаем:
Завершающий штрих. Если на вашем сайте включены пермалинки, то, для того, чтобы страницы типа поста корректно отображались (и отображались вообще), переходим в Параметры > Постоянные ссылки и, ничего не меняя, нажимаем «Сохранить изменения».
А как добавить к новому типу постов, возможность добавления комментариев. В данный момент пишет -
No comments so far!
Comments are closed
При чем для стандартных записей и страниц комментарии работают
у меня лично с комментариями все в порядке, работает без проблем
Спасибо огромное. Прикрутил магазин на wordpress, и надо было сделать отдельный тип записей для товаров. Перепробовал разные плагины, а все было не то. А тут все так просто и понятно, ничего лишнего. Очень помогло. Сейчас вот пытаюсь добавить таксономию, разбить полученные товары на рубрики и добавить метки. Может подскажете как это сделать?
С таксономией разобрался. Вставляем следом за вышеописанным в статье кодом в functions.php, код такой:
и все, появится раздел, аналогичный рубрикам
Здравствуйте. Сделал таксономию типа "Рубрики", ссылка формируется нормально, но, когда пытаешься открыть запись в этой рубрике, выдает 404 ошибку 🙁
Ссылка получается вида сайт.ру/рубрика/подрубрика/пост.html
Т.е. таксономия типа "Теги" работает нормально, посты открываются, а в рубриках, нет 🙁
Не подскажете как с этим бороться?
Добрый день!
Рекомендую зайди в Настройки > Постоянные ссылки и просто нажать кнопку сохранения настроек.
Мне это помогло, спасибо!
Не получается....
Добавил ваш код в функцион пхп, но ничего не поменялось...
А как заставить вывести в теме, на главной, и в категориях, вместо родных записей, мои?
Попробуйте использовать фильтр
pre_get_posts
, я писал про него тут.А если у меня и категории свои?
Короче я поставил плагин Events Manager он создал свои типы для Категорий, записей, тегов... А тема у меня на главной выводит последние записи по категориям.
Т.е. блок :
Категория 1 а в ней 4 последних записи.
Категория 2 и в ней 4 последних записей.
Так вот я уже долго борюсь с тем чтоб подменить в выводе в теме category на event-categories и post на event
Тут, я предполагаю, всё зависит от кода вашей темы.
А можно так
Можно и через код, да.
подскажите пожалуйста, как подключить теги к произвольным типам записи?
register_taxonomy_for_object_type() вам поможет.
Приветствую, Михаил! Вопрос такой. Возможно ли сделать в произвольном типе несколько записей со своими шаблонами страниц. Например, есть произвольная запись Игрок, внутри у нее есть таксономии Лига, Команда и ДВЕ записи Анкета и Характеристики
Возможно ли такое вообще и если возможно, то как сие сделать?
Добрый день!
Этим заниматься пока не приходилось, но вскользь интересовался — думаю, что ответ да.
Понятно. Спасибо...
А как вывести новый тип во Внешний вид - Меню
Новый тип не отображается там.
Отображается только стандартные.
А мне надо добавлять в меню ссылки нового типа записи
Смотрите Настройки экрана (верхний правый угол) в разделе Меню, наверняка надо просто галочку поставить для нужной кастомной записи
СПС. то что надо!!!
Добрый день.
Сделал произвольный тип, все показывается и работает, но нет постраничной навигации.
Доходит до 10 записи и все.
вставлял , но все равно не показывает
Добрый день!
А какой постраничной навигацией пользуетесь? WP-PageNavi?
Народ помогите разобраться.
Зарегистрировал свой тип данных
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'taxonomies'=>array( 'clothing','clothing2' ),
'rewrite'=>array( 'slug' => 'services'),
'capability_type' => 'post',
'hierarchical' => true,
'supports' => array(
'title',
'editor',
'comments',
'thumbnail',
'page-attributes',
'post-formats'
)
создаю пост все нормально работает, а
как только указываю родителя
Пост не открывает, а вообще переадресовывает на дефолтовую запсиь "привет мир"
в чем проблема может быть?
Попробуйте зайти в Настройки > Постоянные ссылки и ничего не меняя нажать кнопку сохранения.
Делал много раз
А как называется этот тип?
services назвал
Нет ли страниц или записей с таким ярлыком? Попробуйте переименовать в services2 и посмотреть, что получится.
Есть несколько вопросов:
- После создания произвольного типа записи категории у неё будут общие со стандартным типом ?
- Теперь при создании нового типа записи он создает урл: домен/название типа записи/имя записи. Как сделать так чтобы он делал как и раньше. Потому что поломались и хлебные крошки после этого
Категории вообще не будет у произвольных записей. Их надо отдельно подключать
Чтобы не ломались пермалинки надо добавить еще аргумент
Я в итоге сделал всё через плагин custom post type ui, Соответственно у меня вопрос куда вставить этот код ? и как быть с категориями ?
Или может вообще не заморачиваться с произвольным типом записаей и сделать всё через шаблоны стандартных записей ?
Ну может быть, се зависит от задач, которые требуется выполнить
добрый день!
Прошу помочь, как вывести произвольные поля в созданном произвольном типе поста?
Этот код выводит только на страницах записи произвольные поля, а мне нужно в на записи созданного произвольного типа.
Добрый день!
Замените в этой строчке
post
на название вашего произвольного типа. А на записи вам тоже нужно?Спасибо помогло! А если придется и в других записях делать нужно
писать?
Добрый день Михаил. Вот когда тип определяется так
Поля появляются. А если так
не появляются. Я еще Новичок в WordPress и php. Охота разобраться. Может подскажите где почитать
спасибо нашел ошибку надо было
спасибо, понял
А зачем вы в функциях пишете ? в Advansed custom fields можно привязать поля и к кастомным типам записей. А блок произвольных полей добавить в single.php
Не все хотят работать чисто через плагины 🙂
Добрый день!
Вынес блог как произвольный тип записей (записи и рубрики). Возникло 2 проблемы:
1. Через меню вывожу рубрики в корневом разделе (site.ru/slug/). Но в них нет слага! То есть вместо site.ru/slug/name-rubrik получаю site.ru/name-rubrik
2. Как бы tag сделать как у вас, чтобы было https://misha.agency/blog/tag/tutorials сейчас опять же имею site.ru/tag/name-tag
Добрый день!
В настройках постоянных ссылок установите префикс для меток
blog/tag
.Кроме того, в функции register_post_type есть параметр rewrite with_front, попробуйте установить
true
.with_front принимает значение true по-умолчанию. с тегами вопрос решился. для рубрик также добавил префикс в виде интересующего меня слага. не очень в восторге от такого решения вопроса по рубрикам.. но вроде работает.
все получилось.
Но возникла следующая проблема.
Как сделать ссылку следующего вида:
/%postname%/%year%-%monthnum%-%day%-%post_id%
/news/shkoli_otrimajut_pidruchniki_do_kincja_roku_mon/2015-10-01-313
(/%category%/%postname%/%year%-%monthnum%-%day%-%post_id%)
Сейчас она такая:
/news/shkoli_otrimajut_pidruchniki_do_kincja_roku_mon
Здравствуйте! Возникла такая проблема:
После добавления нового типа записи я забыл обновить постоянные ссылки. Теперь я не могу просматривать посты, публикуемые в этом типе записи - у меня просто отображается главная страница.
Дальнейшее обновление постоянных ссылок не помогло. Проблема решается только когда я во вкладе "Постоянные ссылки" выставляю параметр "Простые", но меня такой вариант не устраивает. Подскажите как поступить в такой ситуации.
Заранее спасибо за ответ.
Здравствуйте!
Не имеет значения, когда вы обновляете постоянные ссылки - сразу после создания типа записи или потом. Возможно проблема в чем-то другом. Как вы назвали свой тип?
При регистрации типа записи, оказывается не было ошибок. Я одновременно регистрировал таксономию и из-за параметра rewrite мой пост не отображался.
Михаил, здравствуйте. Мне нужно реализовать портфолио примерно как у вас. Можетет помочь с этим? В общем, зарегистрировал я кастомный тип записи my-portoflio. Создал страницу с Портфолио и шаблон page-portfolio.php, в нем вывожу превью кастомной записи с помощью get_posts();. Создал сам файл single-portfolio.php и там вывожу сам текст. И все вроде бы хорошо. Но адреса не очень красиво получаются.
Например, у вас так: truemisha.ru/portfolio и потом truemisha.ru/portfolio/работа. У меня же вот так: сайт.ru/portfolio, а вот потом сайт.ru/my_portfolio/работа. То есть адрес сайта меняется, это не очень красиво. Причем при попытке переименовать название кастомного типа записи на просто portfolio, перестают подключаться шаблоны page-portfolio.php и single-portfolio.php, а выводится архив.
Уже всю голову сломал. Как это у вас реализовано? Специально зарегистрировался, надеюсь хоть настоящий профессионал мне поможет.
Здравствуйте, Иван!
А при регистрации типа поста что тут у вас указано?
Просто вот такая строчка:
Все, разобрался! Спасибо вам, Михаил. Неделю никто помочь не мог)) Прописал нужный слаг и все заработало
Отлично, я рад, что у вас всё получилось! )