深入解析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 相关文章推荐
JAVA/JSP学习系列之二
Oct 09 PHP
基于mysql的bbs设计(二)
Oct 09 PHP
php 执行系统命令的方法
Jul 07 PHP
php自动注册登录验证机制实现代码
Dec 20 PHP
win7+apache+php+mysql环境配置操作详解
Jun 10 PHP
PHP的curl实现get,post和cookie(实例介绍)
Jun 17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
Jun 23 PHP
ThinkPHP应用模式扩展详解
Jul 16 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
CentOS 上搭建 PHP7 开发测试环境
Feb 26 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
在字符串指定位置插入一段字符串的php代码
2010/02/16 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
拉动滚动条加载数据的jquery代码
2012/05/03 Javascript
jQuery给多个不同元素添加class样式的方法
2015/03/26 Javascript
JavaScript点击按钮后弹出透明浮动层的方法
2015/05/11 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
js实现带农历和八字等信息的日历特效
2016/05/16 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
canvas 画布在主流浏览器中的尺寸限制详细介绍
2016/12/15 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
基于JavaScript实现轮播图原理及示例
2020/04/10 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
介绍一下SQL Server的全文索引
2013/08/15 面试题
如何写你的创业计划书
2014/01/07 职场文书
新学期班主任寄语
2014/01/18 职场文书
人力资源部经理岗位职责规定
2014/02/23 职场文书
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
美国留学经济担保书
2014/05/20 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
临床专业自荐信
2014/06/22 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
遗嘱范文
2015/08/07 职场文书
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS
Java 中的 Lambda List 转 Map 的多种方法详解
2022/07/07 Java/Android