Могу ли я назначить шаблон для пользовательского типа сообщения?


35

Могу ли я назначить файл шаблона для пользовательского типа сообщения?

Я создал пользовательский тип записи с именем items, и я хотел бы назначить шаблоны для элементов, как вы можете сделать со страницами.


wpbeginner.com/wp-themes/…… (это для постов, но вы можете изменить его для CPT) nathanrice.net/blog/wordpress-single-post-templates (это для постов, но вы можете изменить его для CPT) Это хорошая идея для плагина на самом деле.
Вик

Ответы:


50

Начиная с версии 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 /


21

Вы можете создать шаблон для пользовательских типов записей, создав файлы, например:

single-mycustomposttype.php

См. Иерархия шаблонов в кодексе.

PS : на это уже ответили.


2
Спасибо за это, но я хотел бы знать, можно ли добавить пользовательские шаблоны для пользовательских типов записей. Так, например, могу ли я создать два шаблона и назначить каждому шаблону соответствующий пост? Насколько я понимаю, это позволяет указать только один файл шаблона для обработки этого конкретного типа записи.
Odyss3us

Видите ли, если вам нужны разные шаблоны для отдельных сообщений, вы можете создать несколько пользовательских типов сообщений, в соответствии с каждым необходимым шаблоном. Я думаю, это зависит от того, сколько разных шаблонов вам нужно. что вы собираетесь делать в шаблонах, которые должны быть разными в каждом посте?
mike23

Этот ответ сейчас устарел. Смотрите ответ Винода Дальви.
Саймон Ист

8

Вот что работает для меня:

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шаблон, если он существует.


4

Для тех, кто попадает в эту ветку через Google, в WP 4.7 введены шаблоны для всех типов сообщений. Смотрите Make WP Core для полного прохождения. Вы больше не ограничены одним шаблоном для всех ваших CPT, вы можете назначать отдельные шаблоны пост за постом, как вы можете сделать со страницами.


2

Это немного старый, но вы также можете попробовать это:

Создайте шаблон для пользовательского типа сообщения:

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

1

Сначала создайте на странице, названной как Предметы, по вашему желанию, которая отображает содержимое из типов записей элементов, а затем создайте один файл шаблона, как показано ниже, и назвали этот шаблон-элементы. Выберите этот шаблон для страницы, которую вы создали.

<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>

1

Это очень просто сделать.

Создайте новый 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();?>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.