深入解析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连mysql和oracle数据库性能比较
Oct 09 PHP
php下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
如何使用Strace调试工具
Jun 03 PHP
php输入流php://input使用示例(php发送图片流到服务器)
Dec 25 PHP
PHP传参之传值与传址的区别
Apr 24 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
Jul 06 PHP
PHP页面转UTF-8中文编码乱码的解决办法
Oct 20 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
PHP实现支付宝即时到账功能
Dec 21 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
laravel框架中间件简单使用方法示例
Jan 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配置心得包含MYSQL5乱码解决
2006/11/20 PHP
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
PHP与Web页面的交互示例详解一
2020/08/04 PHP
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
js获取元素的标签名实现方法
2016/10/08 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
微信小程序实现动态显示和隐藏某个控件功能示例
2018/12/14 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
js实现点赞效果
2020/03/16 Javascript
python基础教程之自定义函数介绍
2014/08/29 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
Pandas分组与排序的实现
2019/07/23 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
Python读取xlsx数据生成图标代码实例
2020/08/12 Python
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
大专生工程监理求职信
2013/10/04 职场文书
历史系自荐信范文
2013/12/24 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
放弃继承权公证书
2015/01/23 职场文书
大学生个人学习总结
2015/02/15 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server