深入解析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 相关文章推荐
php heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
PHP 地址栏信息的获取代码
Jan 07 PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 PHP
PHP抓屏函数实现屏幕快照代码分享
Jan 02 PHP
PHP中数组的分组排序实例
Jun 01 PHP
PHP生成指定长度随机数最简洁的方法
Jul 14 PHP
推荐一款MAC OS X 下php集成开发环境mamp
Nov 08 PHP
php表单提交实例讲解
Nov 12 PHP
java微信开发之上传下载多媒体文件
Jun 24 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 PHP
php 实现银联商务H5支付的示例代码
Oct 12 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 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
剖析 PHP 中的输出缓冲
2006/12/21 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
PHP实现腾讯短网址生成api接口实例
2020/12/08 PHP
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
Extjs4 消息框去掉关闭按钮(类似Ext.Msg.alert)
2013/04/02 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
jquery.validate使用时遇到的问题
2015/05/25 Javascript
利用jQuery的动画函数animate实现豌豆发射效果
2016/08/28 Javascript
javascript阻止事件冒泡和浏览器的默认行为
2017/01/21 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
jQuery实现的记住帐号密码功能完整示例
2019/08/03 jQuery
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
Nuxt 嵌套路由nuxt-child组件用法(父子页面组件的传值)
2020/11/05 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
python使用xmlrpc实例讲解
2013/12/17 Python
python使用ctypes模块调用windowsapi获取系统版本示例
2014/04/17 Python
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
Django的分页器实例(paginator)
2017/12/01 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
简单了解Django应用app及分布式路由
2019/07/24 Python
Python 远程开关机的方法
2020/11/18 Python
Django url 路由匹配过程详解
2021/01/22 Python
介绍一下Make? 为什么使用make
2016/07/31 面试题
团队经理竞聘书
2014/03/31 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
报效祖国演讲稿
2014/09/15 职场文书
付款证明模板
2015/06/19 职场文书
高中语文教学反思范文
2016/02/16 职场文书
人事行政部各岗位职责说明书!
2019/07/15 职场文书
实战Python爬虫爬取酷我音乐
2022/04/11 Python