Custom Post Templates

时间:2013-06-07 作者:Sven

The Issue: 我正在寻找定制的单篇文章模板,以添加或删除单个元素作为普通单篇文章的功能。

有很多方法可以在WordPress中为单个帖子创建自定义帖子模板。尤其是post格式是使用默认模板处理默认情况的绝佳机会;然而,我需要真正的自定义模板。

The Idea: 我的第一种方法是根据post ID添加if/else语句:

// check if custom post
if ( is_single(\'999\') )
    // check if there is a custom post template file
    if ( file_exists(TEMPLATEPATH . \'/single-999.php\' )
        // use custom post template
        return TEMPLATEPATH . \'/single-999.php\'; 
// use normal post template for everything else
include(TEMPLATEPATH . \'/single.php\');
好吧,这并没有错,但如果出现越来越多的特殊情况,我的模板代码就会完全混乱。因此,如果有一个与post ID对应的模板,我可以使用过滤器来始终使用自定义模板:

add_filter( \'single_template\', function( $template ) {
    // check if there is a custom post template file
    if ( file_exists(TEMPLATEPATH . \'/single-\' . $GLOBALS[\'post\']->ID . \'.php\') )
        // use custom post template
        return TEMPLATEPATH . \'/single-\' . $GLOBALS[\'post\']->ID . \'.php\';
    // use normal post template for everything else
    return $template;
});
但现在我将得到许多自定义模板文件,除了一些小的更改外,这些文件都是相同的。

More Thoughts: 我想我更愿意在single.php 模板,以便与自定义包含/筛选器挂钩?

The Question: 是否有不同的(更具排他性的)方法来获取这些类型的自定义帖子模板?

Update: 在许多这种特殊情况下,我需要添加一些额外的样式表或Javascript,但也需要添加带有HTML和PHP内容的自定义容器(这就是为什么我尝试使用自定义模板而不是自定义字段)。大多数情况下,附加元素位于上方、下方或旁边the_content().

3 个回复
最合适的回答,由SO网友:Sven 整理而成

WordPress 4.4最终实现了这一点(如Make WordPress Core).

WordPresstemplate hierarchy 现在允许使用如下命名模式的单个自定义帖子模板:

single-{post_type}-{post_name}.php
引用John Blackbourn的话,模板遵循以下规则:

此模板遵循的规则is_single() 并用于单个帖子或自定义帖子类型。[…]它位于之前的层次结构中single.phpsingle-{post_type}.php.

SO网友:Ravinder Kumar

我认为这种方法会奏效。

1.为单篇文章创建模板singlepost.php(默认单帖子模板),singlepost-99.php,singlepost-101.php.

2.现在只输入此代码single.php

<?php
global $post;
get_template_part(\'singlepost\',$post->ID);
?>
如果找不到调用,此代码将按帖子id检查当前帖子的单个帖子模板singlepost.php.

Important Link:

get_template_part()

SO网友:Martin Zeitler

为了使其成为模板,您必须添加注释:

<?php
  /*
  Template Name: Page, two columns
  */
  get_header();
?>
无论您在注释中指定什么名称-

可以在WP admin侧边栏中选择作为模板。

像这样,您不会得到数百个不同的模板位。

我的意思是,即使上述解决方案有效,也必须考虑维护。

结束