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

35

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

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

Odyss3us
источник
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 : на это уже ответили.

mike23
источник
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, вы можете назначать отдельные шаблоны пост за постом, как вы можете сделать со страницами.

WebElaine
источник
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
eballeste
источник
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();?>
jerryurenaa
источник