深入解析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高手?学会“懒惰”的编程
Dec 05 PHP
ajax实现无刷新分页(php)
Jul 18 PHP
php入门学习知识点二 PHP简单的分页过程与原理
Jul 14 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
Oct 17 PHP
php中使用DOM类读取XML文件的实现代码
Dec 14 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
Yii框架form表单用法实例
Dec 04 PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 PHP
php实现多城市切换特效
Aug 09 PHP
php中序列化与反序列化详解
Feb 13 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
CI框架网页缓存简单用法分析
Dec 26 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企业级应用之常见缓存技术篇
2011/01/27 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
50个比较实用jQuery代码段
2011/09/18 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
2019/03/07 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
Vue 中 template 有且只能一个 root的原因解析(源码分析)
2020/04/11 Javascript
解析Python中的异常处理
2015/04/28 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
浅谈python迭代器
2017/11/08 Python
python 以16进制打印输出的方法
2018/07/09 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
Python进程间通信multiprocess代码实例
2020/03/18 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
Html5之title吸顶功能
2018/06/04 HTML / CSS
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
授权委托书怎么写
2014/09/25 职场文书
保险公司反洗钱宣传活动总结
2015/05/08 职场文书
校园安全学习心得体会
2016/01/18 职场文书
2016大学生毕业实习心得体会
2016/01/23 职场文书
区域销售大会开幕词
2016/03/04 职场文书
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
Python Matplotlib绘制动画的代码详解
2022/05/30 Python