Отображение пользовательских типов сообщений — шаблоны и запросы
Опубликовано: 2016-09-26Это третья и последняя статья из нашей серии о пользовательских типах записей (CPT). Темы, которые мы обсуждали в первых двух, были:
- Пользовательские типы сообщений (как их создавать)
- Пользовательские таксономии
В первой и второй статьях мы зарегистрировали пользовательский тип записи testimonials и пользовательскую таксономию testimonial_service . Теперь нам нужно отобразить отзывы на нашем сайте. Итак, мы рассмотрим, как создать шаблон для наших отзывов, как запрашивать их и как отображать их в любом месте на нашем сайте.
Шаблоны пользовательских типов сообщений по умолчанию
Мы создали наш CPT с параметром has_archive
, установленным в true, который будет отображать все отзывы на странице архива .
WordPress использует иерархию шаблонов для отображения различных типов контента. Для пользовательского типа записи он будет искать:
архив-{post_type}.php
одиночный-{post_type}.php
Если эти шаблоны не определены в теме, то она будет искать общие шаблоны:
архив.php
сингл.php
Если даже эти шаблоны не определены, то по умолчанию будет использоваться шаблон index.php .
В нашем случае тема Shaka имеет шаблон single.php , но не имеет шаблона archive.php . Это означает, что он по умолчанию будет использовать шаблон single.php для одной страницы с отзывами. Он также будет использовать шаблон index.php для отображения всех отзывов на странице архива отзывов.
Отзывы будут отображаться на странице архива отзывов , которая будет расположена на этой странице:
http://your-domain-goes-here.com/ ?post_type=testimonials
Если у вас включены красивые постоянные ссылки, вы также можете получить доступ к странице с этим URL-адресом:
http://your-domain-goes-here.com/ отзывы
(Примечание: если красивые постоянные ссылки у вас не работают, перейдите в wp-admin -> Настройки -> Постоянные ссылки и настройте их так, как вы хотите, и сохраните настройки)
Во-первых, мы должны написать несколько отзывов во вновь зарегистрированных CPT Testimonials , чтобы у нас были некоторые данные для отображения. Я добавил 3 отзыва, и вот как выглядит стандартный макет страницы архива отзывов в нашей теме Shaka:
Как видите, макет в порядке, но некоторые отображаемые данные не нужны, например, «по автору» и дата. Также пользовательская таксономия testimonial_service не отображается, поэтому мы добавим ее в наши пользовательские шаблоны.
Создание пользовательских шаблонов для нашего CPT
Как упоминалось в предыдущем разделе, мы должны создать два шаблона. Архив-testimonials.php и single-testimonials.php . Мы создадим шаблон archive-testimonials.php только для этого примера.
Мы должны создать эти файлы в дочерней теме, но для простоты я добавлю файл archive-testimonials.php непосредственно в тему Shaka. Я скопирую файл index.php, который будет служить отправной точкой, и переименую его в archive-testimonials.php .
Я удалил «по автору», код даты и боковую панель. Я добавил избранные изображения и пользовательскую таксономию службы отзывов. Я использовал функцию WP the_terms
, которая отображает список конкретных терминов WP, в нашем случае пользовательскую таксономию.

Знаю, что эстетически это выглядит не офигенно, но не в этом дело. Мы хотели создать другую структуру/макет страницы архива отзывов с другими данными, и это было достигнуто за несколько минут.
Мы также могли бы сделать то же самое для страницы с одним отзывом. Мы скопировали файл single.php , переименовали его в single-testimonials.php и изменили код оттуда.
Я не показывал здесь никакого кода, так как примеры кода будут разными для каждой темы, а для кодирования шаблонов необходимы некоторые базовые знания HTML и PHP. Но всегда проще изменить существующий шаблон, поэтому мы использовали index.php в качестве отправной точки.
Запрос пользовательских типов сообщений
Еще один способ отобразить пользовательские типы сообщений на вашем сайте — использовать класс WP_Query для получения пользовательских типов сообщений (перебирать и отображать их).
Допустим, вы хотите создать виджет, который отображает все отзывы в карусели. Или, что вы хотели бы отображать связанные отзывы (такая же таксономия службы отзывов) на одной странице отзывов. Вы должны использовать класс WP_Query
для получения соответствующих отзывов.
В нашем примере мы получим все отзывы, которые находятся в пользовательской таксономии службы отзывов «дайвинга», и выведем их в список:
<?php $args = array( 'post_type' => 'testimonials', 'post_status' => 'publish', 'tax_query' => array( array( 'taxonomy' => 'testimonial_service', 'field' => 'slug', 'terms' => 'diving' ) ) ); $testimonials = new WP_Query( $args ); if( $testimonials->have_posts() ) : ?> <ul> <?php while( $testimonials->have_posts() ) : $testimonials->the_post(); ?> <li><?php printf( '%1$s - %2$s', get_the_title(), get_the_content() ); ?></li> <?php endwhile; wp_reset_postdata(); ?> </ul> <?php else : esc_html_e( 'No testimonials in the diving taxonomy!', 'text-domain' ); endif; ?>
Как вы можете видеть в приведенном выше коде, мы сначала подготавливаем массив настроек аргументов, которые позже используются при инициализации WP_Query
. В этом массиве мы определяем для извлечения:
- `отзывы` CPT,
- получать только те отзывы, которые опубликованы,
- получить только те отзывы, которые находятся в пользовательской таксономии дайвинга «testimonial_service».
Когда new WP_Query
, извлекаются соответствующие отзывы, и мы можем просмотреть их. В цикле мы просто выводим заголовок (который я использовал для имени автора) и содержание отзыва в виде простого списка. Кроме того, мы всегда должны использовать функцию wp_reset_postdata
для возврата к исходному циклу, когда мы используем цикл WP_Query. Это гарантирует, что все будет работать после того, как мы закончим с нашим пользовательским запросом.
Это были основы пользовательских типов записей, и я надеюсь, что теперь вы понимаете, как они работают. Как и в любой теме, всегда есть больше деталей, которые нужно углубить. Я бы посоветовал вам просмотреть официальную документацию WP для всех функций и классов, которые мы использовали в этих примерах. Дайте мне знать в разделе комментариев ниже, если у вас есть какие-либо вопросы.