欢迎莅临阿Q的项目

专业WP商业设计开发销售中心

WordPress开发教程:模板层次结构

本文将解释WordPress如何确定在单个页面上使用哪个模板文件。如果您想自定义现有的WordPress主题,它将帮助您决定需要编辑哪个模板文件。

模板层次结构

如前所述,模板文件是模块化的,可重复使用的文件,用于在您的WordPress网站上生成网页。一些模板文件(如页眉和页脚模板)用于所有网站的页面,而其他模板文件仅在特定条件下使用。

本文将解释WordPress如何确定在单个页面上使用哪个模板文件。如果您想自定义现有的WordPress主题,它将帮助您决定需要编辑哪个模板文件。

模板文件层次结构

概况

WordPress使用查询字符串来决定应使用哪个模板或一组模板来显示页面。查询字符串是包含在您网站每个部分的链接中的信息。它出现在最初的问号之后,可能包含许多用&符号分隔的参数。

简而言之,WordPress搜索整个模板层次结构,直到找到匹配的模板文件。要确定使用哪个模板文件,WordPress:

  • 将每个查询字符串匹配到查询类型以决定请求哪个页面(例如,搜索页面,分类目录页面等);
  • 按模板层次结构确定的顺序选择模板;
  • 查找当前主题目录中具有特定名称的模板文件,并使用层次结构指定的第一个匹配模板文件。

除了基本的 index.php 模板文件外,您可以选择是否要实现特定的模板文件。

如果WordPress无法找到具有匹配名称的模板文件,它将跳至层次结构中的下一个文件。如果WordPress找不到任何匹配的模板文件,则会使用主题的 index.php 文件。

范例

如果您的博客位于http://example.com/blog/,并且访问者点击指向类别页面的链接(例如http://example.com/blog/category/your-cat/),则WordPress会查找模板,将当前主题的目录中的文件与该类别的ID相匹配以生成正确的页面。 更具体地说,WordPress遵循这个过程:

  1. 在当前主题的目录中查找与类别的slug匹配的模板文件。 如果类别 slugunicorns ,那么WordPress会查找名为 category-unicorns.php 的模板文件。
  2. 如果 category-unicorns.php 丢失,并且该类别的ID为4,则WordPress会查找名为 category-4.php 的模板文件。
  3. 如果缺少 category-4.php,WordPress将查找通用类别模板文件 category.php
  4. 如果 category.php 不存在,WordPress将查找通用档案模板 archive.php
  5. 如果 archive.php 也不存在,WordPress会回退到主主题模板文件 index.php

视觉概览

下图显示了根据WordPress模板层次结构调用哪些模板文件来生成WordPress页面。

你也可以与这个图表进行交互

详细模板层次结构

尽管模板层次结构更容易理解为图表,但以下各节将介绍WordPress针对多种查询类型调用模板文件的顺序。

主页

默认情况下,WordPress会将您网站的主页设置为显示您最新的博客文章。这个页面被称为博客文章索引。 您还可以将您的博客帖子设置为在单独的静态页面上显示。模板文件 home.php 用于呈现博客文章索引,无论它是作为首页还是单独的静态页面使用。 如果 home.php 不存在,WordPress将使用 index.php

  1. home.php
  2. index.php

如果存在 front-page.php,它将覆盖 home.php 模板。

首页

front-page.php 模板文件用于呈现站点的首页,无论首页是显示博客文章索引(如上所述)还是静态页面。首页模板优先于博客文章索引(home.php)模板。如果 front-page.php 文件不存在,WordPress将根据设置→阅读中的设置使用 home.phppage.php 文件。如果这两个文件都不存在,它将使用 index.php 文件。

  1. front-page.php - 用于设置→阅读的头版显示部分中设置的“最新帖子”或“静态页面”。
  2. home.php - 如果WordPress无法找到 front-page.php,并且在“首页显示”部分设置了“您的最新文章”,它会查找 home.php。此外,WordPress会在首页显示部分设置帖子页面时查找此文件。
  3. page.php - 在管理后台的阅读设置中你的主页显示选择的一个静态页面时。
  4. index.php - 在首页显示部分设置“你的最新文章”,但 home.php 不存在,或者设置了首页,但 page.php 不存在。

正如你所看到的,WordPress有什么样的路径有很多规则。使用上面的图表是确定WordPress将显示的最佳方式。

单个文章

单个文章模板文件用于呈现单个文章。WordPress使用以下路径:

  1. single-{post-type}-{slug}.php - (自4.4开始)首先,WordPress查找特定帖子的模板。 例如,如果文章类型是 product,文章Slug是 dmc-12,则WordPress会查找 single-product-dmc-12.php
  2. single-{post-type}.php - 如果帖子类型是产品,WordPress会查找 single-product-dmc-12.php。
  3. single.php - WordPress然后回落到single.php。
  4. singular.php - 然后它回落到singular.php。
  5. index.php - 最后,如上所述,WordPress最终会退回到index.php。

单个页面

用于呈现静态页面的模板文件(page文章类型)。请注意,与其他后期类型不同,页面对于WordPress而言是特殊的,并使用以下路径:

自定义模板文件 - 分配给页面的页面模板。 请参阅get_page_templates()。

  1. page-{slug}.php - 如果页面slug是 recent-news,WordPress将使用 page-recent-news.php
  2. page-{id}.php - 如果页面ID是6,WordPress将会使用page-6.php。
  3. page.php
  4. singular.php
  5. index.php

分类目录

渲染分类目录归档索引页面在WordPress中使用以下路径:

  1. category-{slug}.php - 如果该类别的消息是 news,则WordPress将查找 category-news.php
  2. category-{id}.php - 如果该类别的ID是6,WordPress将查找 category-6.php
  3. category.php
  4. archive.php
  5. index.php

标签

要显示标签归档索引页面,WordPress使用以下路径:

  1. tag-{slug}.php - 如果标签的slug是 sometag,WordPress会查找 tag-sometag.php
  2. tag-{id}.php - 如果标签的ID是6,WordPress将查找 tag-6.php
  3. tag.php
  4. archive.php
  5. index.php

自定义分类法

自定义分类法使用稍微不同的模板文件路径:

  1. taxonomy-{taxonomy}-{term}.php - 如果分类法是sometax,并且其分类是someterm的话,那么WordPress会寻找 taxonomy-sometax-someterm.php。在文章形式的情况下,分类是 'post_format',而分类是 'post-format-{format}'。 即链接文章格式的 taxonomy-post_format-post-format-link.php
  2. taxonomy-{taxonomy}.php - 如果分类标准为sometax,WordPress会查找taxonomy-sometax.php。
  3. taxonomy.php
  4. archive.php
  5. index.php

自定义文章类型

自定义文章类型使用以下路径来呈现相应的归档索引页面。

  1. archive-{post_type}.php - 如果帖子类型是product,WordPress将查找 archive-product.php
  2. archive.php
  3. index.php

(要渲染单个文章类型的模板,请参阅上面的单个文章部分。)

作者

基于上述示例,呈现作者归档索引页面相当具有说明性:

  1. author-{nicename}.php - 如果作者的昵称是matt,WordPress会查找 author-matt.php
  2. author-{id}.php - 如果作者的ID是6,WordPress会查找 author-6.php
  3. author.php
  4. archive.php
  5. index.php

日期

基于日期的归档索引页面按照您的预期呈现:

  1. date.php
  2. archive.php
  3. index.php

搜索结果

搜索结果遵循与其他模板类型相同的模式:

  1. search.php
  2. index.php

404(未找到)

同样,按以下顺序调用404模板文件:

  1. 404.php
  2. index.php

附件

呈现附件页面(附件文章类型)使用以下路径:

  1. {MIME-type}.php - 可以是任何MIME类型(例如:image.phpvideo.phppdf.php)。对于text / plain,使用以下路径(按顺序):
    1. text-plain.php
    2. plain.php
    3. text.php
  2. attachment.php
  3. single-attachment-{slug}.php - 例如,如果附件slug是holiday,WordPress将查找 single-attachment-holiday.php
  4. single-attachment.php
  5. single.php
  6. singular.php
  7. index.php

嵌入

嵌入模板文件用于呈现正在嵌入的文章。自4.5以来,WordPress使用以下路径:

  1. embed-{post-type}-{post_format}.php - 首先,WordPress为特定帖子查找模板。例如,如果其文章类型是帖子并且具有音频格式,则WordPress会查找 embed-post-audio.php
  2. embed-{post-type}.php - 如果帖子类型是产品,WordPress会查找embed-product.php。
  3. embed.php - WordPress然后回落到embed.php。

最后,WordPress最终会回归到它自己的 wp-includes/theme-compat/embed.php 模板。

非ASCII字符处理

由于WordPress 4.7,其名称中包含非ASCII字符的模板名称的任何动态部分实际上都支持未编码和已编码形式,按此顺序。您可以选择使用哪个。

以下是名为“Hello World😀”的页面的页面模板层次结构,ID为6:

  • page-hello-world-😀.php
  • page-hello-world-%f0%9f%98%80.php
  • page-6.php
  • page.php
  • singular.php

同样的行为适用于文章slug,分类名称和作者昵称。

过滤器层次结构

WordPress模板系统允许您过滤层次结构。这意味着您可以在层次结构的特定位置插入和更改事物。过滤器(位于get_query_template() 函数中)使用此过滤器名称:“{$type}_template”,其中$type是模板类型。

以下是模板层次结构中所有可用过滤器的列表:

  • embed_template
  • 404_template
  • search_template
  • frontpage_template
  • home_template
  • taxonomy_template
  • attachment_template
  • single_template
  • page_template
  • singular_template
  • category_template
  • TAG_TEMPLATE
  • author_template
  • date_template
  • archive_template
  • index_template

范例

例如,让我们采用默认的作者层次结构:

  • author-{nicename}.php
  • author-{id}.php
  • author.php

要在 author.php 之前添加 author-{role}.php,我们可以使用 'author_template' 模板类型来操作实际的层次结构。 这允许请求 /author/username,其中username具有编辑器的角色,如果存在于当前主题目录中,则使用 author-editor.php 显示。

<?php
function author_role_template( $templates = '' ) {
	$author = get_queried_object();
	$role = $author->roles[0];
 
	if ( ! is_array( $templates ) && ! empty( $templates ) ) {
		$templates = locate_template( array( "author-$role.php", $templates ), false );
	} elseif ( empty( $templates ) ) {
		$templates = locate_template( "author-$role.php", false );
	} else {
		$new_template = locate_template( array( "author-$role.php" ) );
		if ( ! empty( $new_template ) ) {
			array_unshift( $templates, $new_template );
		}
	}
 
	return $templates;
}
add_filter( 'author_template', 'author_role_template' );
?>
如果喜欢本文,请分享给朋友们