问题描述

有人可以向我解释这个功能如何工作?我知道它是什么,但是当我查看 twenty_ten 模板中的源代码时,我不知道如何在一个单独的循环中收集所有循环 (我也看到了这个文件) 。

那么例如,如何抽象出一些模板的常见部分,然后在其他模板中重用呢?

最佳解决方案

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

基本上,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 数组中的每个名称,然后在模板目录中查找。作为 $ load 参数传递’true’ 意味着它将需要找到第一个文件,如果没有找到模板文件,它将返回一个空字符串。所以我可以在我的插件中做这样的事情:

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

… 应该希望主题开发人员可以通过在主题中包含一个名为 loop-mycustomposttype.php 的文件来自定义我的插件。

次佳解决方案

不是所有的循环,主循环。 ;-) 无论你看你的头版还是类别,或者知道什么,你总是会有一个主循环。该主循环的内容由在您的模板被调用之前运行的查询确定。

loop.php 模板仅在循环中的项目上运行,并对它们进行格式化。见 the documentation at the Codex

如果你看看 Twenty-Ten 的 loop.php,你可以看到,Twenty-Ten 然后在单个模板文件中多样化。

get_template_part()仅加载一个模板部件并运行它。您也可以将 loop.php 的部分解压缩到单独的文件中,并通过 get_template_part('loop', 'category')等进行替换。

或者您可以在循环中为每个单独的帖子设置一个 part-template,并使您的 loop.php 仅在 while... 子句中调用 get_template_part('loop','post'); 。一切由你决定。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。