页面模板是一种特定类型的模板文件,可应用于特定页面或一组页面。

自 WordPress 4.7 起,页面模板支持所有文章类型。有关如何将页面模板设置为特定文章类型的详细信息,请参见下面的示例。

由于页面模板是特定类型的模板文件,以下是页面模板的一些区别特征:

  • 页面模板用于更改页面的外观和感觉。
  • 页面模板可应用于单个页面、页面部分或一类页面。
  • 页面模板通常具有较高的特异性,针对单个页面或一组页面。例如,名为page-about.php的页面模板比模板文件page.php或index.php更具特异性,因为它只会影响 slug 为“about”的页面。
  • 如果页面模板具有模板名称,编辑页面的 WordPress 用户可以控制用于渲染页面的模板。

页面模板的用途

页面模板在页面上显示您站点的动态内容,例如文章、新闻更新、日历事件、媒体文件等。您可能希望您的主页看起来与众不同,与其他部分大不相同。或者,您可能希望在页面的一部分显示指向文章的缩略图,在其他地方显示最新文章列表,并使用自定义导航。您可以使用页面模板来实现这些功能。

本节向您展示如何构建可由用户通过管理屏幕选择的页面模板。

例如,您可以为以下项目构建页面模板:

  • 全宽、单列
  • 双列,右侧带侧边栏
  • 双列,左侧带侧边栏
  • 三列

模板层级中的页面模板

当有人浏览到您的网站时,WordPress 会选择用于渲染该页面的模板。正如我们之前在模板层级中所学到的那样,WordPress 按以下顺序查找模板文件:

  1. 页面模板 —如果页面已分配自定义模板,WordPress 会查找该文件,如果找到则使用它。
  2. page-{slug}.php —如果没有分配自定义模板,WordPress 会查找并使用包含页面 slug 的专用模板。
  3. page-{id}.php —如果找不到包含页面 slug 的专用模板,WordPress 会查找并使用以页面 ID 命名的专用模板。
  4. page.php —如果找不到包含页面 ID 的专用模板,WordPress 会查找并使用主题默认的页面模板。
  5. singular.php —如果未找到page.php,WordPress 会查找并使用用于单个文章的模板,无论文章类型如何。
  6. index.php —如果没有分配或找到特定的页面模板,WordPress 默认使用主题的 index 文件来渲染页面。

还有一个名为paged.php的 WordPress 定义模板。它不用于页面文章类型,而是用于显示多个存档页面。

页面模板的目的与用户控制

如果您计划为您的主题创建自定义页面模板,在继续之前应决定以下几点:

  • 该页面模板是用于特定页面还是任何页面;以及
  • 您希望为该模板提供何种类型的用户控制。

每个具有模板名称的页面模板都可以在用户创建或编辑页面时由用户选择。可用模板列表可在页面 > 添加新页面 > 属性 > 模板中找到。因此,WordPress 用户可以选择不带模板名称的任何页面模板,这可能不是您的本意。

例如,如果您希望为“关于我们”页面拥有特定模板,则不应将该页面模板命名为“关于我们模板”,因为它将全局可用给所有页面(即用户可将其应用于任何页面)。相反,创建一个单次使用模板,每当用户访问“关于我们”页面时,WordPress 都会使用该适当模板渲染页面。

相反,许多主题包括选择页面列数的功能。每个选项都是一个全局可用的页面模板。要为您的 WordPress 用户提供此全局选项,您需要为每个选项创建页面模板并赋予每个模板一个模板名称。

通过文件命名方式以及是否包含特定注释,可以决定模板是用于全局使用还是单次使用。

有时即使看起来是单次使用情况,也适合使模板全局可用。当您为发布创建主题时,很难预测用户会如何命名他们的页面。作品集页面是一个很好的例子,因为并非每个 WordPress 用户都会以相同的方式命名他们的作品集或拥有相同的页面 ID,但他们可能希望使用该模板。

页面模板的文件组织

正如在组织主题文件中讨论的那样,WordPress 可以识别存储在主题根文件夹或主题文件夹的一级子目录中的页面模板。

page-templates/文件夹是组织全局页面模板的常见约定,但不是必需的。页面模板也可以存储在其他一级子目录中,例如templates/或page_templates/。

不支持嵌套子目录,例如pages/templates/中的页面模板。

注意:专用页面模板文件(即专为单个特定页面创建的文件)不能存储在子文件夹中。如果您使用子主题,专用页面模板也不能存储在父主题的文件夹中。

为全局使用创建自定义页面模板

有时您希望创建一个可由任何页面或多个页面全局使用的模板。一些开发人员会将他们的模板与文件名前缀分组,例如page_two-columns.php

重要!不要使用page-作为前缀,因为 WordPress 会将该文件解释为专用模板,旨在仅应用于您网站上的一个页面。

有关主题文件命名约定和不能使用文件名的信息,请参阅保留的主题文件名。

创建新页面模板的快速安全方法是复制page.php并给新文件一个不同的文件名。这样,您就可以从其他页面的 HTML 结构开始,并根据需要编辑新文件。

要创建全局模板,请在文件顶部编写一个说明模板名称的 PHP 注释。

<?php /* Template Name: Example Template */ ?>

选择一个描述模板功能的名称是个好主意,因为该名称在用户编辑页面时对 WordPress 用户可见。例如,您可以将模板命名为主页、博客或作品集。

此来自 TwentyFourteen 主题的示例创建了一个名为全宽页面的页面模板:

<?php
/**
* Template Name: Full Width Page
*
* @package WordPress
* @subpackage Twenty_Fourteen
* @since Twenty Fourteen 1.0
*/
basics-page-templates-03

将文件上传到主题的文件夹(例如,page-templates)后,转到管理仪表板中的页面 > 编辑屏幕。

在右侧的属性下,您将看到模板。这是用户访问您的全局页面模板的地方。

选择列表的最大宽度为 250px,因此较长的名称可能会被截断。

为特定页面创建自定义页面模板

正如在模板层级页面中提到的那样,您可以为特定页面创建模板。要为单个特定页面创建模板,请复制现有的page.php文件并将其重命名为页面的 slug 或 ID:

  1. page-{slug}.php
  2. page-{ID}.php

例如:您的“关于我们”页面的 slug 为‘about’,ID 为 6。如果您的活动主题的文件夹中有名为page-about.php或page-6.php的文件,则 WordPress 会自动找到并使用该文件来渲染“关于我们”页面。

要使用专用页面模板,它们必须位于您的主题文件夹中(即/wp-content/themes/my-theme-name/ )。

为特定文章类型创建页面模板

默认情况下,自定义页面模板将可用于“页面”文章类型。

若要为特定文章类型创建页面模板,请在模板名称下方添加一行,列出您希望该模板支持的文章类型。

示例:

<?php
/*
Template Name: Full-width layout
Template Post Type: post, page, event
*/
// Page code here...

为“page”文章类型以外的文章类型添加页面模板的功能仅从 WordPress 4.7 开始支持。

当至少存在一个针对某篇文章类型的模板时,后台将显示‘Post Attributes’(文章属性)元数据框,无需为此添加对‘page-attributes’的支持或其他操作。使用‘attributes’标签在注册文章类型时,可以针对每种文章类型自定义‘Post Attributes’的标签。

向后兼容性:

假设您希望公开发布一个支持文章类型模板的主题。WordPress 4.7 之前的版本将忽略“Template Post Type”(文章类型模板)头部信息,并将该模板显示在页面模板列表中,即使它仅适用于普通文章。为防止这种情况,您可以钩入 theme_page_templates 过滤器将其从列表中排除。示例如下:

/**
 * Hides the custom post template for pages on WordPress 4.6 and older
 *
 * @param array $post_templates Array of page templates. Keys are filenames, values are translated names.
 * @return array Filtered array of page templates.
 */
function makewp_exclude_page_templates( $post_templates ) {
	if ( version_compare( $GLOBALS['wp_version'], '4.7', '&lt;' ) ) {
		unset( $post_templates['templates/my-full-width-post-template.php'] );
	}
	return $post_templates;
}

add_filter( 'theme_page_templates', 'makewp_exclude_page_templates' );

这样,您就可以在 WordPress 4.7 及更高版本中支持自定义文章类型模板,同时保持完全的向后兼容性。

请注意,theme_page_templates 实际上是一个动态的 theme_{$post_type}_templates 过滤器。钩子名称的动态部分 $post_type 指的是模板所支持的文章类型。例如,您可以钩入 theme_product_templates 来过滤产品文章类型的模板列表。

在页面模板中使用条件标签

您可以在主题的 page.php 文件中利用 Conditional Tags(条件标签)进行更小、针对特定页面的更改。例如,下面的示例代码为您的首页加载文件 header-home.php,而为您的“About”页面加载另一个文件 (header-about.php),然后对所有其他页面应用默认的 header.php。

if ( is_front_page() ) :
	get_header( 'home' );
elseif ( is_page( 'About' ) ) :
	get_header( 'about' );
else:
	get_header();
endif;

您可以在此处了解更多关于条件标签的信息。

识别页面模板

如果您的模板使用 body_class() 函数,WordPress 将在 body 标签中打印类名,包括文章类型类名 (page)、页面的 ID (page-id-{ID}) 以及使用的页面模板。对于默认的 page.php,生成的类名为 page-template-default:

<body class="page page-id-6 page-template-default">

专用模板 (page-{slug}.php 或 page-{ID}.php) 也会获得 page-template-default 类,而不是其自身的 body 类。

使用自定义页面模板时,将打印 page-template 类以及命名特定模板的类。例如,如果您的自定义页面模板文件命名如下:

<?php
/* Template Name: My Custom Page */
?>

则生成的渲染 HTML 将如下所示:

<body class="page page-id-6 page-template page-template-my-custom-page-php">

请注意应用于 body 标签的 page-template-my-custom-page-php 类。

页面模板函数

这些内置的 WordPress 函数和方法可帮助您处理页面模板:

  • get_page_template() 返回用于渲染页面的页面模板路径。
  • wp_get_theme()->get_page_templates() 返回当前活动主题可用的所有自定义页面模板 (get_page_templates() 是 WP_Theme 类的方法)。
  • is_page_template() 根据是否使用自定义页面模板渲染页面返回 true 或 false。
  • get_page_template_slug() 返回自定义字段 _wp_page_template 的值(当值为空或“default”时为 null)。如果页面已分配了自定义模板,则该模板的文件名存储为名为 '_wp_page_template' 的 自定义字段 的值(在 wp_postmeta 数据库表中)。(以下划线开头的自定义字段不会显示在编辑屏幕的自定义字段模块中。)