如何使用get_template_part()?


25

有人可以向我解释此功能的工作原理吗?我知道它的作用,但是当我查看二十个模板中的源代码时,我不知道如何在一个单独的loop.php中收集所有循环(我也看到了该文件)。

那么,例如,如何抽象出模板的某个公共部分,然后在其他模板之间重用呢?


Answers:


25

这里有一些非常好的介绍性答案。

基本上,get_template_part()允许主题开发人员设置模板文件的特定顺序。将其应用于CSS选择器时,应将其与特定性相似。设计某些东西时,您要从最低限度的特异性开始,以便可以在需要个人注意的设计部分轻松覆盖它。

因此,例如,您正在设计博客的样式并创建一个loop.php文件,该文件非常适合标记帖子。但是您要事先计划,以后再在模板文件中使用附加的上下文说明符来调用它-例如,在索引页面上,调用get_template_part( 'loop', 'index' );,在单个模板上,调用get_template_part( 'loop', 'single' );,在存档页面上,调用get_template_part( 'loop', 'archive' );,依此类推。当您决定在存档页面上标记与首页不同的标记时,这将非常容易:仅创建一个loop-archive.php模板即可使用,而不是通用的loop.php

但是背后的魔力get_template_part()在函数中locate_template(),该函数首先检查主题目录,然后检查父目录(如果存在)以查找命名的文件。这对于插件开发非常有用。在我的一个插件中,我定义了一个自定义帖子类型,并在我的插件目录中为该自定义帖子类型创建了一个循环模板文件。但是...如果他们愿意,我想允许使用插件的主题覆盖我的标记。这是locate_template()真正起作用的奇迹。

locate_template($template_names, $load = false, $require_once = true )

会在样式表目录的$ template_names数组中,然后在模板目录中寻找每个名称。传递'true'作为$ load参数意味着它将需要找到的第一个文件,如果未找到模板文件,则将返回一个空字符串。因此,我可以在插件中执行以下操作:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

...这应该使主题开发人员只需在主题中包含一个名为loop-mycustomposttype.php的文件即可轻松定制我的插件。


2
请以此替换locate_template。include(locate_template( 'loop-mycustomposttype.php')) 这样可以传递变量。我在这里找到了此链接。这非常有用!
Pablo SG Pacheco 2014年

1
这样做也有必要更改它。像这样if ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Pablo SG Pacheco 2014年

1
哦,好点。使用我给出的公式,requireor require_once调用(来自locate_template)位于函数内部,因此无法访问当前作用域。
goldenapples 2014年

5

并非所有循环,主循环。;-)无论您查看首页还是类别,或者知道什么,总会有一个主循环。该主循环的内容由根本未调用模板之前运行的查询确定。

loop.php模板仅运行循环中的项目并设置其格式。请参阅食典文件

如果您看二十多岁的loop.php,您会发现二十多岁然后单个模板文件中多样化。

get_template_part()只需加载一个模板零件并运行它。您也可以将loop.php的一部分提取到单独的文件中,并用a get_template_part('loop', 'category')等等替换它们。

或者,您可以为循环中的每个帖子提供一个部分模板,并使loop.php仅get_template_part('loop','post');while...子句中调用。都由你定。


3

get_template_part Codex中

<?php get_template_part( 'loop', 'index' ); ?>

将对存在的第一个文件执行PHP require()...

如此有效地工作,就好像您需要另一个php文件一样。

更新:'require'略有不同-它包装在一个函数中,因此global如果要将任何变量从模板传递到模板部件,则必须这样做。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.