深入解析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 相关文章推荐
第1次亲密接触PHP5(2)
Oct 09 PHP
PHP新手上路(五)
Oct 09 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
Mar 16 PHP
解析php二分法查找数组是否包含某一元素
May 23 PHP
国外十大最流行的PHP框架排名
Jul 04 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
PHP获取数组最大值下标的方法
May 12 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
php-app开发接口加密详解
Apr 18 PHP
解决laravel资源加载路径设置的问题
Oct 14 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中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
8个必备的PHP功能实例代码
2013/10/27 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
Javascript Global对象
2009/08/13 Javascript
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
PHP中使用微秒计算脚本执行时间例子
2014/11/19 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
2015/12/03 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
js原生跨域_用script标签的简单实现
2016/09/24 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
详解react-router4 异步加载路由两种方法
2017/09/12 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
vue+springboot实现项目的CORS跨域请求
2018/09/05 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
javascript定时器的简单应用示例【控制方块移动】
2019/06/17 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
对python中xlsx,csv以及json文件的相互转化方法详解
2018/12/25 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
python连接mongodb集群方法详解
2020/02/13 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
数据库面试要点基本概念
2013/10/31 面试题
客户代表实习人员自我鉴定
2013/09/27 职场文书
测绘工程专业个人自我评价
2013/12/01 职场文书
学习新党章思想汇报
2014/01/09 职场文书
十岁生日父母答谢词
2014/01/18 职场文书
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
绿色校园广播稿
2014/10/13 职场文书