Могу ли я назначить файл шаблона для пользовательского типа сообщения?
Я создал пользовательский тип записи с именем items
, и я хотел бы назначить шаблоны для элементов, как вы можете сделать со страницами.
Могу ли я назначить файл шаблона для пользовательского типа сообщения?
Я создал пользовательский тип записи с именем items
, и я хотел бы назначить шаблоны для элементов, как вы можете сделать со страницами.
Ответы:
Начиная с версии 4.7 WordPress , теперь вы можете назначать пользовательские шаблоны страниц другим типам сообщений наряду со страницей.
Для этого в дополнение к заголовку файла «Имя шаблона» можно указать типы сообщений, поддерживаемые шаблоном, с помощью «Тип сообщения шаблона»:
<?php
/*
Template Name: Full-width page layout
Template Post Type: post, page, product
*/
Вы можете получить больше информации об этом на следующих страницах.
https://wptavern.com/wordpress-4-7-brings-custom-page-template-functionality-to-all-post-types https://make.wordpress.org/core/2016/11/03/post -типа-шаблоны-в-4-7 /
Вы можете создать шаблон для пользовательских типов записей, создав файлы, например:
single-mycustomposttype.php
См. Иерархия шаблонов в кодексе.
PS : на это уже ответили.
Вот что работает для меня:
add_filter('single_template', function($original){
global $post;
$post_name = $post->post_name;
$post_type = $post->post_type;
$base_name = 'single-' . $post_type . '-' . $post_name . '.php';
$template = locate_template($base_name);
if ($template && ! empty($template)) return $template;
return $original;
});
Таким образом, данный пост с пользовательским типом поста foobar
и фрагмент hello-world
кода, приведенного выше, загрузят single-foobar-hello-world.php
шаблон, если он существует.
Для тех, кто попадает в эту ветку через Google, в WP 4.7 введены шаблоны для всех типов сообщений. Смотрите Make WP Core для полного прохождения. Вы больше не ограничены одним шаблоном для всех ваших CPT, вы можете назначать отдельные шаблоны пост за постом, как вы можете сделать со страницами.
Это немного старый, но вы также можете попробовать это:
Создайте шаблон для пользовательского типа сообщения:
single-*custom-post-type-slug*.php
Файл должен проверить слаг и проверить, существует ли файл, если нет, то откат к файлу шаблона по умолчанию:
<?php
$slug = get_post_field( 'post_name', get_post() );
$slug = ( locate_template( 'templates/*custom-post-type-slug*/' . $slug . '.php' ) ) ? $slug : 'default';
get_template_part( 'templates/*custom-post-type-slug*/' . $slug );
?>
Замените все экземпляры custom-post-type-slug на фактический slug вашего пользовательского типа записи.
Я делаю это для простоты использования и организационных целей. Это кажется мне чище, чем иметь все файлы в корневой папке темы.
пример структуры папок:
themeroot
| |single-cases.php
|-templates
| --cases
| |default.php
| |case-one.php
| |case-two.php
Сначала создайте на странице, названной как Предметы, по вашему желанию, которая отображает содержимое из типов записей элементов, а затем создайте один файл шаблона, как показано ниже, и назвали этот шаблон-элементы. Выберите этот шаблон для страницы, которую вы создали.
<div class="container">
<div class="row">
<div class="col-md-9">
<div class="panel panel-default text-center">
<?php $loop = new WP_Query( array( 'post_type' => 'items', 'posts_per_page' => 5 ) ); ?>
<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>
<?php the_title();?>
<?php if(has_post_thumbnail() ) { the_post_thumbnail(); } ?>
<?php the_content();?>
<?php endwhile; ?>
<?php wp_reset_query(); ?>
</div>
</div>
</div>
</div>
Это очень просто сделать.
Создайте новый PHP-файл в корневом каталоге вашей темы и добавьте его в начало:
<?php /*
* Template Name: My custom view
* Template Post Type: Post_typename // here you need to add the name of your custom post type
*/ ?>
Полный пример будет следующим:
<?php /*
* Template Name: My custom view
* Template Post Type: Post_typename // here you need to add the name of your custom post type
*/ ?>
<?php get_header();?>
<div class="container pt-5 pb-5">
<?php if (has_post_thumbnail()):?>
<img src="<?php the_post_thumbnail_url('largest');?>" class="img-fluid">
<?php endif;?>
<?php if (have_posts()) : while (have_posts()) : the_post();?>
<?php the_content();?>
<?php endwhile; endif;?>
</div>
<?php get_footer();?>
Мы разработали другое решение, используя пользовательский плагин шаблона поста.