深入解析WordPress中加载模板的get_template_part函数


Posted in PHP onJanuary 11, 2016

最近研究官方主题 Twenty Eleven ,有一些东西网上现成的中文资料不好找,在博客里记载下来,算是分享,也算是备忘,wordpress 3.0 以后就开始便有了get_template_part() 这个函数 ,应该是为文章呈现形式提供更为多样化的选择而给出的新功能。

Twenty Eleven 中 实例如下:

Twenty Eleven index.php 文件
 行:21

<?php if ( have_posts() ) : ?>
 <?php twentyeleven_content_nav( 'nav-above' ); ?>
 <?php /* Start the Loop 在循环中使用以调用不同类型的文章 */ ?>
 <?php while ( have_posts() ) : the_post(); ?>
 <?php get_template_part( 'content', get_post_format() ); ?>
 <?php endwhile; ?>
............................
<?php endif; ?>

描述:
加载一个制定的模板到另一个模板里面(不同于包含header,sidebar,footer).
使得一个主题使用子模板来实现代码段重用变得简单

用于在模板中包含指定的模板文件,只需用指定参数slug和name就可以包含文件{slug}-{name}.php,最重要的功能是如果没有这个文件就包含没有{name}的.php文件文件

使用方法:

<?php get_template_part( $slug, $name ) ?>

参数:

  • $slug (必须) 通用的模板名
  • $name (可选) 指定的模板名

示例:

使用 loop.php 在子主题里面

假设主题文件夹wp-content/themes下父主题是twentyten子主题twentytenchild,那么下面的代码:

<?php get_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文件给主题添加导航条:

<?php get_template_part( 'nav' );      // Navigation bar (nav.php) ?>
<?php get_template_part( 'nav', '2' );   // Navigation bar #2 (nav-2.php) ?>
<?php get_template_part( 'nav', 'single' ); // Navigation bar to use in single pages (nav-single.php) ?>

get_template_part() 的钩子详解
因为在官方主题(Twenty Eleven)中 get_template_part() 函数被大量使用,所以就目前来看,该函数应该算是比较热门的一个函数了,之前有写过一篇文章讲述该函数的具体使用方法,在这里也就不便再赘述,本文主要针对该函数的 add_action 中的 hook $tag 值进行探讨,因为,WP hook 中林林总总有那么些函数在$tag 值中比较让人费解。

与普通hook的区别
普通的hook的$tag 是一个固定值,而 get_template_part() 确是一个可变值,好吧先不说,wp这么做给我们实现一个简单功能带来多少麻烦,但如此设置确实给多样化的主题实现带来了不少方便之处。
实现这一原理的源代码如下,截取自 WordPress 源程序。

function get_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 文件
 
//那么我们想挂一个函数的话就得像如下
function addFunction ($slug, $name){
echo $slug;
}
add_action("get_template_part_index","addFunction",10,2);

get_template_part() 函数详解备忘

PHP 相关文章推荐
js下函数般调用正则的方法附代码
Jun 22 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
Oct 23 PHP
PHP过滤黑名单关键字的方法
Dec 01 PHP
PHP+MySQL插入操作实例
Jan 21 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 PHP
PHP 序列化和反序列化函数实例详解
Jul 18 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
Jul 04 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
PHP实现基于文本的摩斯电码生成器
Jan 11 #PHP
简单了解WordPress开发中update_option()函数的用法
Jan 11 #PHP
WordPress后台中实现图片上传功能的实例讲解
Jan 11 #PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 #PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
Jan 11 #PHP
[原创]PHP简单开启curl的方法(测试可行)
Jan 11 #PHP
详解YII关联查询
Jan 10 #PHP
You might like
ThinkPHP框架安全实现分析
2016/03/14 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
Bootstrap BootstrapDialog使用详解
2017/02/17 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
vue的基本用法与常见指令
2017/08/15 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
vuex刷新后数据丢失的解决方法
2020/10/18 Javascript
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
python 杀死自身进程的实现方法
2019/07/01 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
关于安全演讲稿
2014/05/09 职场文书
法定代表人身份证明书
2014/09/10 职场文书
餐厅保洁员岗位职责
2015/04/10 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
百年校庆感言
2015/08/01 职场文书
讲解Python实例练习逆序输出字符串
2022/05/06 Python
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技
LeetCode189轮转数组python示例
2022/08/05 Python