WordPress默认的post模板是single.php,如果是自定义post type,优先级更高的模板是single-$posttype.php,今天发现了一种更随心所欲的方法,根据文章所在目录为post指定page的模板。

WordPress Page Template

WordPress最灵活的模板功能来自于Page模板,只要一个简单的声明,就能指定一个新的模板,例如

<?php
/**
 * Template Name: Post FullWidth Template
 */
?>

将这段代码保存到post-fullwidth-template.php中,到后台创建页面(page)的模板下拉菜单中,就能找到一个名为Post FullWidth Template的模板。但我们不想将模板应用给page,而是要应用给post。

如何让Post使用Page模板

需要用到WordPress模板相关的钩子函数,single_template或者template_include

第一个钩子更直观一些,是用来过滤post模板的,假设要给所有在category 1中的文章应用post-fullwidth-template.php模板,可以这样实现

function sola_custom_post_template( $template ) {
     global $post;
    // check if is a Post and in the 'scott' category
    if(  has_category( 'category 1', $post ) ) {
        return TEMPLATEPATH . '/page-fullwidth-template.php';
    } else {
        return $template;
    }
}
add_filter( 'single_template', 'sola_custom_post_template' );

single_template钩子位于wp-includes/theme.php get_query_template()函数中,形式为

apply_filters( "{$type}_template", locate_template( $templates ) );

template_include位于wp-includes/template-loader.php中,形式为

if ( $template = apply_filters( 'template_include', $template ) )
		include( $template );

通过这些钩子函数,我们可以更灵活的控制模板结构。

2条留言

  1. […] 今天在WordPress Answers发现了一段很有用的代码,如何使自定义类型的文章使用page模板展示,其实前几天也写过这样的代码——根据文章所在目录指定post模板,思路相同代码有点差别,我喜欢收集代码,先收集了备用。 […]

  2. 超技术流啊,看不懂,希望有天我能看懂。

评论功能已关闭