我可以为自定义帖子类型分配模板吗?


35

我可以将模板文件分配给自定义帖子类型吗?

我创建了一个名为的自定义帖子类型items,我想像为页面一样为这些项目分配模板。


wpbeginner.com/wp-themes/…(这是帖子,但您可以针对CPT进行修改)nathanrice.net/blog/wordpress-single-post-templates(这是帖子,但您可以针对CPT对其进行修改)一个插件的好主意。
Wyck

Answers:


50

WordPress 4.7版开始,您现在可以将自定义页面模板与页面一起分配给其他帖子类型。

为此,除了“模板名称”文件头之外,还可以使用“模板发布类型:”来指定模板支持的发布类型。

<?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 -type-templates-in-4-7 /


21

您可以通过创建文件来创建自定义帖子类型的模板,例如:

single-mycustomposttype.php

请参见法典中的模板层次结构

PS:这已经得到回答。


2
谢谢您,但是我想知道的是是否可以向自定义帖子类型添加自定义模板。例如,我可以创建两个模板并将每个模板分配给其各自的职位吗?据我所知,这仅允许指定一个模板文件来处理该特定帖子类型。
Odyss3us 2011年

可以看到,如果单个帖子需要不同的模板,则可能需要根据每个所需的模板创建几种自定义帖子类型。我猜这取决于您需要多少个不同的模板。您将在每个帖子中需要不同的模板中做什么?
mike23 2011年

该答案现在已过期。参见Vinod Dalvi的答案。
西蒙·伊斯特

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引入了适用于所有帖子类型的模板。有关完整的演练,请参见使WP Core。您不再受限于所有CPT的一个模板,可以像使用Pages一样逐个分配单个模板。


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的所有实例替换为您的custom post类型的实际子段。

我这样做是为了易于使用和组织目的。在我看来,比将所有文件都放在主题的根文件夹中更干净。

示例文件夹结构:

themeroot
| |single-cases.php
|-templates
| --cases
|   |default.php
|   |case-one.php
|   |case-two.php

1

首先在您希望的页面上创建一个名为Items的页面,该页面显示来自项目帖子类型的内容,然后按如下方式创建一个模板文件并命名该模板项目。为您创建的页面选择该模板。

<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();?>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.