深入解析WordPress中加载模板的get_template_part函数
最近研究官方主题TwentyEleven,有一些东西网上现成的中文资料不好找,在博客里记载下来,算是分享,也算是备忘,wordpress3.0以后就开始便有了get_template_part()这个函数,应该是为文章呈现形式提供更为多样化的选择而给出的新功能。
TwentyEleven中实例如下:
TwentyElevenindex.php文件
行:21
<?phpif(have_posts()):?> <?phptwentyeleven_content_nav('nav-above');?> <?php/*StarttheLoop在循环中使用以调用不同类型的文章*/?> <?phpwhile(have_posts()):the_post();?> <?phpget_template_part('content',get_post_format());?> <?phpendwhile;?> ............................ <?phpendif;?>
描述:
加载一个制定的模板到另一个模板里面(不同于包含header,sidebar,footer).
使得一个主题使用子模板来实现代码段重用变得简单
用于在模板中包含指定的模板文件,只需用指定参数slug和name就可以包含文件{slug}-{name}.php,最重要的功能是如果没有这个文件就包含没有{name}的.php文件文件
使用方法:
<?phpget_template_part($slug,$name)?>
参数:
- $slug(必须)通用的模板名
- $name(可选)指定的模板名
示例:
使用loop.php在子主题里面
假设主题文件夹wp-content/themes下父主题是twentyten子主题twentytenchild,那么下面的代码:
<?phpget_template_part('loop','index');?>
php的require()函数将按下面优先级包含文件
1.wp-content/themes/twentytenchild/loop-index.php
2.wp-content/themes/twentytenchild/loop.php
3.wp-content/themes/twentyten/loop-index.php
4.wp-content/themes/twentyten/loop.php
导航(这个例子很烂,但却是另一种使用思路)
使用通用的nav.php文件给主题添加导航条:
<?phpget_template_part('nav');//Navigationbar(nav.php)?> <?phpget_template_part('nav','2');//Navigationbar#2(nav-2.php)?> <?phpget_template_part('nav','single');//Navigationbartouseinsinglepages(nav-single.php)?>
get_template_part()的钩子详解
因为在官方主题(TwentyEleven)中get_template_part()函数被大量使用,所以就目前来看,该函数应该算是比较热门的一个函数了,之前有写过一篇文章讲述该函数的具体使用方法,在这里也就不便再赘述,本文主要针对该函数的add_action中的hook$tag值进行探讨,因为,WPhook中林林总总有那么些函数在$tag值中比较让人费解。
与普通hook的区别
普通的hook的$tag是一个固定值,而get_template_part()确是一个可变值,好吧先不说,wp这么做给我们实现一个简单功能带来多少麻烦,但如此设置确实给多样化的主题实现带来了不少方便之处。
实现这一原理的源代码如下,截取自WordPress源程序。
functionget_template_part($slug,$name=null){ //$tag="get_template_part_{$slug}" //也就是,get_template_part_+你当时设置的$slug值 do_action("get_template_part_{$slug}",$slug,$name); $templates=array(); if(isset($name)) $templates[]="{$slug}-{$name}.php"; $templates[]="{$slug}.php"; locate_template($templates,true,false); }
实例
像上面那样说,可能也许基本上有点看不明白,好吧给点实例
//复习一下get_template_part($slug,$name)的用法, //如果你在主题里这样 get_template_part('index','photo'); //那么WP会去找主题根目录下index-photo.php文件 //那么我们想挂一个函数的话就得像如下 functionaddFunction($slug,$name){ echo$slug; } add_action("get_template_part_index","addFunction",10,2);
get_template_part()函数详解备忘