丶你那么重要 發表於 2023-6-4 00:00:00

深入解析WordPress中加载模板的get_template_part函数

<p>
最近研究官方主题 Twenty Eleven ,有一些东西网上现成的中文资料不好找,在博客里记载下来,算是分享,也算是备忘,wordpress 3.0 以后就开始便有了get_template_part() 这个函数 ,应该是为文章呈现形式提供更为多样化的选择而给出的新功能。</p>
<p>
Twenty Eleven 中 实例如下:</p>
<p>
Twenty Eleven index.php 文件<br>
 行:21</p>
<div>
<div>
<div id="highlighter_954280">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
</td>
<td>
<div>
<div>
<code>&lt;?php </code><code>if</code> <code>( have_posts() ) : ?&gt;</code>
</div>
<div>
<code> </code><code>&lt;?php twentyeleven_content_nav( </code><code>'nav-above'</code> <code>); ?&gt;</code>
</div>
<div>
<code> </code><code>&lt;?php </code><code>/* Start the Loop 在循环中使用以调用不同类型的文章 */</code> <code>?&gt;</code>
</div>
<div>
<code> </code><code>&lt;?php </code><code>while</code> <code>( have_posts() ) : the_post(); ?&gt;</code>
</div>
<div>
<code> </code><code>&lt;?php get_template_part( </code><code>'content'</code><code>, get_post_format() ); ?&gt;</code>
</div>
<div>
<code> </code><code>&lt;?php </code><code>endwhile</code><code>; ?&gt;</code>
</div>
<div>
<code>............................</code>
</div>
<div>
<code>&lt;?php </code><code>endif</code><code>; ?&gt;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
描述:<br>
加载一个制定的模板到另一个模板里面(不同于包含header,sidebar,footer).<br>
使得一个主题使用子模板来实现代码段重用变得简单</p>
<p>
用于在模板中包含指定的模板文件,只需用指定参数slug和name就可以包含文件{slug}-{name}.php,最重要的功能是如果没有这个文件就包含没有{name}的.php文件文件</p>
<p>
使用方法:</p>
<div>
<div>
<div id="highlighter_167923">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>&lt;?php get_template_part( </code><code>$slug</code><code>, </code><code>$name</code> <code>) ?&gt;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
参数:</p>
<ul>
<li>
$slug (必须) 通用的模板名</li>
<li>
$name (可选) 指定的模板名</li>
</ul>
<p>
示例:</p>
<p>
使用 loop.php 在子主题里面</p>
<p>
假设主题文件夹wp-content/themes下父主题是twentyten子主题twentytenchild,那么下面的代码:</p>
<div>
<div>
<div id="highlighter_932929">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
</td>
<td>
<div>
<div>
<code>&lt;?php get_template_part( </code><code>'loop'</code><code>, </code><code>'index'</code> <code>); ?&gt;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
php 的require()函数将按下面优先级包含文件</p>
<p>
1. wp-content/themes/twentytenchild/loop-index.php<br>
2. wp-content/themes/twentytenchild/loop.php<br>
3. wp-content/themes/twentyten/loop-index.php<br>
4. wp-content/themes/twentyten/loop.php</p>
<p>
导航(这个例子很烂,但却是另一种使用思路)<br>
使用通用的nav.php文件给主题添加导航条:</p>
<div>
<div>
<div id="highlighter_551880">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
</td>
<td>
<div>
<div>
<code>&lt;?php get_template_part( </code><code>'nav'</code> <code>);      </code><code>// Navigation bar (nav.php) ?&gt;</code>
</div>
<div>
<code>&lt;?php get_template_part( </code><code>'nav'</code><code>, </code><code>'2'</code> <code>);   </code><code>// Navigation bar #2 (nav-2.php) ?&gt;</code>
</div>
<div>
<code>&lt;?php get_template_part( </code><code>'nav'</code><code>, </code><code>'single'</code> <code>); </code><code>// Navigation bar to use in single pages (nav-single.php) ?&gt;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>get_template_part() 的钩子详解</strong><br>
因为在官方主题(Twenty Eleven)中 get_template_part() 函数被大量使用,所以就目前来看,该函数应该算是比较热门的一个函数了,之前有写过一篇文章讲述该函数的具体使用方法,在这里也就不便再赘述,本文主要针对该函数的 add_action 中的 hook $tag 值进行探讨,因为,WP hook 中林林总总有那么些函数在$tag 值中比较让人费解。</p>
<p>
与普通hook的区别<br>
普通的hook的$tag 是一个固定值,而 get_template_part() 确是一个可变值,好吧先不说,wp这么做给我们实现一个简单功能带来多少麻烦,但如此设置确实给多样化的主题实现带来了不少方便之处。<br>
实现这一原理的源代码如下,截取自 WordPress 源程序。</p>
<div>
<div>
<div id="highlighter_133382">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
</td>
<td>
<div>
<div>
<code>function</code> <code>get_template_part( </code><code>$slug</code><code>, </code><code>$name</code> <code>= null ) {</code>
</div>
<div>
<code>//$tag = "get_template_part_{$slug}" </code>
</div>
<div>
<code>//也就是,get_template_part_+你当时设置的$slug值</code>
</div>
<div>
<code> </code><code>do_action( </code><code>"get_template_part_{$slug}"</code><code>, </code><code>$slug</code><code>, </code><code>$name</code> <code>);</code>
</div>
<div>
<code> </code><code>$templates</code> <code>= </code><code>array</code><code>();</code>
</div>
<div>
<code> </code><code>if</code> <code>( isset(</code><code>$name</code><code>) )</code>
</div>
<div>
<code>  </code><code>$templates</code><code>[] = </code><code>"{$slug}-{$name}.php"</code><code>;</code>
</div>
<div>
<code>  </code><code>$templates</code><code>[] = </code><code>"{$slug}.php"</code><code>;</code>
</div>
<div>
<code>  </code><code>locate_template(</code><code>$templates</code><code>, true, false);</code>
</div>
<div>
<code>}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
实例<br>
像上面那样说,可能也许基本上有点看不明白,好吧给点实例</p>
<p>
 </p>
<div>
<div>
<div id="highlighter_572872">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
</td>
<td>
<div>
<div>
<code>//复习一下get_template_part($slug, $name)的用法,</code>
</div>
<div>
<code>//如果你在主题里这样</code>
</div>
<div>
<code>get_template_part( </code><code>'index'</code> <code>, </code><code>'photo'</code><code>);</code>
</div>
<div>
<code>//那么 WP 会去找主题根目录下 index-photo.php 文件</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>//那么我们想挂一个函数的话就得像如下</code>
</div>
<div>
<code>function</code> <code>addFunction (</code><code>$slug</code><code>, </code><code>$name</code><code>){</code>
</div>
<div>
<code>echo</code> <code>$slug</code><code>;</code>
</div>
<div>
<code>}</code>
</div>
<div>
<code>add_action(</code><code>"get_template_part_index"</code><code>,</code><code>"addFunction"</code><code>,10,2);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div id="codetool">
<div>
<textarea></textarea>
</div>
</div>
</div>
<p>
get_template_part() 函数详解备忘</p>
頁: [1]
查看完整版本: 深入解析WordPress中加载模板的get_template_part函数