В этой записи пойдет речь о том, как создать собственный тип поста, делать запросы в базу по собственному типу, а так же как добавлять новые данные к уже существующим запросам.Как я уже описал выше, вы можете создать собственные шаблоны для своего типа поста. Точно так же как у определенных типов записей есть собственные шаблоны, например single.php
и archive.php
— вы можете сделать тоже самое.
single-{тип_поста}.php
— для просмотра полной записи с собственным типом постаarchive-{тип_поста}.php
— для архивов
Где указано {post_type}
— это и есть $post_type
аргумент внутри функции register_post_type().
Теперь из того, что мы выучили ранее, вы можете создать файлы single-bologer_product.php
и archive-bologer_product.php
для отображения одиночной страницы продукта, а так же страница с архивом.
В дополнении, с помощью функцию is_post_type_archive() вы можете проверить если отображаемая страница имеет тип архивной страницы, а так же отобразить заголовок страницы с помощью post_type_archive_title().
Делаем запрос по типу поста
Вы можете получить данные определенного типа, добавив ключ post_type
как аргумент внутри конструктора класса WP_Query
.
Делается это следующим образом:
$args = [ 'post_type' => 'product', 'posts_per_page' => 10, ]; $loop = new WP_Query($args); while ($loop->have_posts()) { $loop->the_post(); ?> <div class="entry-content"> <?php the_title(); ?> <?php the_content(); ?> </div> <?php }
В примере выше, мы взяли 10 записей и в цикле выводим заголовок и контент каждой из них.
Добавляет данные в текущий запрос
Регистрируя новый тип поста не означает, что он автоматически попадает в основной запрос.
Если вы хотите, чтобы ваш собственный тип отображался в стандартном архиве или на главной странице, вместе с другими типами, используйте хук pre_get_posts.
Пример ниже покажет посты из категории post
, page
и movie
на главной странице сайта:
function bologer_add_custom_post_types($query) { if (is_home() && $query->is_main_query()) { $query->set('post_type', ['post', 'page', 'movie']); } return $query; } add_action('pre_get_posts', 'bologer_add_custom_post_types');