深入解析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桌面中心(一) 创建数据库
Mar 11 PHP
php minixml详解
Jul 19 PHP
用php过滤危险html代码的函数
Jul 22 PHP
关于PHP实现异步操作的研究
Feb 03 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
php/js获取客户端mac地址的实现代码
Jul 08 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
Sep 30 PHP
PHP实现通过正则表达式替换回调的内容标签
Jun 15 PHP
PHP实现数据分页显示的简单实例
May 26 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
Jun 11 PHP
php简单计算权重的方法示例【适合抽奖类应用】
Jun 10 PHP
PHP如何通过date() 函数格式化显示时间
Nov 13 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/10/09 PHP
xml+php动态载入与分页
2006/10/09 PHP
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
php使用Jpgraph创建柱状图展示年度收支表效果示例
2017/02/15 PHP
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
jquery子元素过滤选择器使用示例
2013/06/24 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
javascript break指定标签打破多层循环示例
2014/01/20 Javascript
jQuery简单实现隐藏以及显示特效
2015/02/26 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
js时间转换毫秒的实例代码
2019/08/21 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
[54:24]Optic vs TNC 2018国际邀请赛小组赛BO2 第二场
2018/08/18 DOTA
python批量制作雷达图的实现方法
2016/07/26 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
求职自荐信
2013/12/14 职场文书
八年级音乐教学反思
2014/01/09 职场文书
大学生志愿者感言
2014/01/15 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
民事起诉状范文
2015/05/19 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
python实现局部图像放大
2021/11/17 Python