深入解析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 相关文章推荐
玩转图像函数库―常见图形操作
Sep 03 PHP
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
May 03 PHP
php 页面执行时间计算代码
Dec 04 PHP
php实现utf-8和GB2312编码相互转换函数代码
Feb 07 PHP
ThinkPHP实现跨模块调用操作方法概述
Jun 20 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
Dec 17 PHP
Symfony2学习笔记之系统路由详解
Mar 17 PHP
php中preg_replace_callback函数简单用法示例
Jul 21 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
Oct 18 PHP
YII2框架中behavior行为的理解与使用方法示例
Mar 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
多文件上传的例子
2006/10/09 PHP
PHP实现链式操作的核心思想
2015/06/23 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
javascript实现禁止鼠标滚轮事件
2015/07/24 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
Vue中img的src属性绑定与static文件夹实例
2017/05/18 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
vue实现与安卓、IOS交互的方法
2018/11/02 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
[02:37]2018DOTA2亚洲邀请赛赛前采访 VP.no[o]ne心中最强SOLO是谁
2018/04/04 DOTA
一文总结学习Python的14张思维导图
2017/10/17 Python
Python基础语言学习笔记总结(精华)
2017/11/14 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
python3发送邮件需要经过代理服务器的示例代码
2019/07/25 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
英语国培研修感言
2014/02/13 职场文书
安踏广告词改编版
2014/03/21 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
挂靠协议书
2015/01/27 职场文书
居委会工作总结2015
2015/05/18 职场文书
《秋天的图画》教学反思
2016/02/19 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
详解Go语言中Get/Post请求测试
2022/06/01 Golang