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 );
通过这些钩子函数,我们可以更灵活的控制模板结构。
超技术流啊,看不懂,希望有天我能看懂。