深入解析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编程效率的53个要点(经验小结)
Sep 04 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
Apr 23 PHP
CI框架入门示例之数据库取数据完整实现方法
Nov 05 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
php生成图片验证码的方法
Apr 15 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
Mar 15 PHP
PHP实现获取第一个中文首字母并进行排序的方法
May 09 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
PHP使用PDO抽象层获取查询结果的方法示例
May 10 PHP
PHP常用的类封装小结【4个工具类】
Jun 28 PHP
thinkPHP+LayUI 流加载实现功能
Sep 27 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
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
分享下PHP register_globals 值为on与off的理解
2013/09/26 PHP
浅析php中json_encode()和json_decode()
2014/05/25 PHP
php 如何设置一个严格控制过期时间的session
2017/05/05 PHP
js创建子窗口并且回传值示例代码
2013/07/02 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
javascript学习笔记--数字格式类型
2014/05/22 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
2019/10/25 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
Python中分数的相关使用教程
2015/03/30 Python
Python中的集合介绍
2019/01/28 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
python ---lambda匿名函数介绍
2019/03/13 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
Python实现连接MySql数据库及增删改查操作详解
2019/04/16 Python
python脚本执行CMD命令并返回结果的例子
2019/08/14 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
详解Python IO编程
2020/07/24 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
分公司负责人任命书
2014/06/04 职场文书
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
党员个人批评与自我批评
2014/10/14 职场文书
自我检讨书范文
2015/01/28 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
分析并发编程之LongAdder原理
2021/06/29 Java/Android
nginx结合openssl实现https的方法
2021/07/25 Servers