页面模板是一种特定类型的模板文件,可以应用于特定的页面或页面组。
从WordPress 4.7开始,页面模板支持所有的文章类型。关于如何为特定的文章类型设置页面模板的更多细节,见下面的例子。
由于页面模板是一种特定类型的模板文件,这里有一些页面模板的区别特征:
- 页面模板是用来改变页面的外观和感觉的
- 一个页面模板可以应用于一个单一的页面,一个页面局部,或一类页面
- 页面模板通常有很高的针对性,针对单个页面或一组页面。例如,一个名为page-about.php的页面模板比模板文件page.php或index.php更具体,因为它将只影响一个标题为 "about "的页面。
- 如果一个页面模板有一个模板名称,编辑该页面的WordPress用户就可以控制使用什么模板来渲染该页面
页面模板的用途
页面模板在一个页面上显示你的网站动态内容,例如,文章、新闻更新、日历事件、媒体文件等。你可能会决定,希望你的主页看起来有一个特定的方式,与你网站的其他部分有很大不同。或者,你可能想在页面的一个部分显示一个链接到文章的特色图片,在其他地方有一个最新文章的列表,并使用一个自定义导航。你可以使用页面模板来实现这些事情。
本节告诉你如何建立页面模板,让你的用户可以通过他们的管理面板进行选择。
例如,您可以为以下内容构建页面模板:
- 全宽,单栏
- 两栏式,右侧为侧边栏
- 两栏式,左侧为侧边栏
- 三栏
模板层次结构中的页面模板
当一个人浏览到你的网站时,WordPress会选择使用哪个模板来渲染这个页面?正如我们先前在模板层次中所学到的,WordPress按照以下顺序寻找模板文件:
- 页面模板 — 如果该页面有指定的自定义模板,WordPress会寻找该文件,如果找到,就使用它
page-{slug}.php
— 如果没有指定自定义模板,WordPress会寻找并使用一个包含页面slug的专门模板。page-{id}.php
— 如果没有找到包含页面slug的专门模板,WordPress会寻找并使用一个以页面ID命名的专门模板page.php
— 如果没有找到包含页面ID的专门模板,WordPress会寻找并使用主题的默认页面模板singular.php
— 如果没有找到page.php,WordPress会寻找并使用用于单个文章的主题模板,而不考虑文章类型index.php
— 如果没有指定或找到特定的页面模板,WordPress默认回到使用主题的索引文件来渲染页面
还有一个WordPress定义的模板名为paged.php。它不是用于“page”文章类型,而是用于显示多页的存档。
页面模板的目的和用户控制
如果你打算为主题制作一个自定义的页面模板,你应该在进行之前决定几件事:
- 页面模板是用于一个特定的页面还是用于任何页面;
- 你希望该模板有什么类型的用户控制。
每一个有模板名称的页面模板都可以由用户在创建或编辑页面时选择。可用的模板列表可以在 页面>新建页面>属性>模板 处找到。因此,一个WordPress用户可以选择任何有模板名称的页面模板,这可能不是你的本意。
例如,如果你想为你的 "关于"页面有一个特定的模板,把这个页面模板命名为 "关于模板"可能是不合适的,因为它对所有的页面都是通用的(也就是说,用户可以把它应用到任何页面)。相反,创建一个单一用途的模板,只要用户访问 "关于 "页面,WordPress就会用适当的模板渲染该页面。
相反,许多主题包括选择一个页面将有多少列的能力。这些选项中的每一个都是一个全局可用的页面模板。为了给你的WordPress用户提供这种全局选项,你将需要为每个选项创建页面模板,并给每个模板命名。
通过文件的命名方式和是否有特定的注释来决定一个模板是全局使用还是单项使用。
有时,让一个模板在全局范围内可用是合适的,即使它看起来只是一个使用案例。当你为发布创建主题时,可能很难预测用户会给他们的页面起什么名字。作品集页面就是一个很好的例子,因为不是每个WordPress用户都会给他们的作品集起同样的名字,或者有同样的页面ID,但他们可能想使用那个模板。
页面模板的文件组织
正如在组织主题文件中所讨论的,WordPress会识别子文件夹page-templates。因此,把你的全局页面模板存放在这个文件夹里是个好主意,有助于保持它们的条理性。
一个专门的页面模板文件(那些只为一次使用而创建的文件)不能放在子文件夹中,如果使用子主题,也不能放在父主题的文件夹中。
创建全局使用的自定义页面模板
有时你会想要一个模板,可以被任何一个或多个页面全局使用。 有些开发者会用一个文件名前缀来分组他们的模板,如page_two-columns.php
重要的是! 不要使用page-作为前缀,因为WordPress会将该文件解释为一个专门的模板,只适用于你网站上的一个页面。
有关主题文件命名约定和不能使用的文件名的信息,请参阅保留主题文件名
创建新页面模板的一个快速、安全的方法是复制page.php,并给新文件一个独特的文件名。这样,你就可以从其他页面的HTML结构开始,你可以根据需要编辑新文件。
要创建一个全局模板,在文件的顶部写一个PHP注释,说明模板的名称:
<?php /* Template Name: Example Template */ ?>
选择一个描述模板作用的名字是个好主意,因为这个名字在WordPress用户编辑页面时是可见的。例如,你可以把你的模板命名为Homepage、Blog或Portfolio
这个例子来自TwentyFourteen主题,创建了一个名为Full Width Page的页面模板
<?php /** * Template Name: Full Width Page * * @package WordPress * @subpackage Twenty_Fourteen * @since Twenty Fourteen 1.0 */
一旦你把文件上传到你的主题文件夹(例如,page-templates),在你的管理仪表板上进入 页面>编辑 界面,在右边的属性下,你会看到模板。 这就是用户能够访问你的全局页面模板的地方。
选择列表的最大宽度为250px,所以较长的名字可能会被切断。
为一个特定的页面创建一个自定义页面模板
正如在模板层次页面中提到的,你可以为一个特定的页面创建一个模板。 要为一个特定的页面创建一个模板,复制你现有的page.php文件,并以你的页面标题或ID重命名它。
page-{slug}.php
page-{ID}.php
举个例子。你的关于页面的slug是“about”,ID是6,然后你的主题文件夹中有一个名为page-about.php或page-6.php的文件,那么WordPress会自动找到并使用该文件来渲染这个关于页面。
为了使用,专门的页面模板必须在你的主题文件夹中(即/wp-content/themes/my-theme-name/ )
为特定的文章类型创建页面模板
默认情况下,一个自定义的页面模板将提供给 "page"文章类型。
要为特定的文章类型创建一个页面模板,在模板名称下添加一行你想让模板支持的文章类型。
例如:
<?php /* Template Name: Full-width layout Template Post Type: post, page, event */ // Page code here...
这种在 "page"文章类型以外的类型中添加页面模板的能力仅从WordPress 4.7开始支持。
当一个文章类型至少存在一个模板时,'文章属性'选框将显示在后端,而不需要添加文章类型支持的'page-attributes'或其他任何东西。文章属性标签可以在注册一个文章类型时使用"属性"标签对每个文章类型进行自定义。
向后兼容:
比方说,你想公开发布一个支持文章类型模板主题。4.7之前的WordPress版本会忽略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', '<' ) ) { 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来过滤product类型的模板列表。
在页面模板中使用条件标签
你可以在主题的page.php文件中用条件标签做一些小的、针对特定页面的改变。例如,下面的例子代码为你的首页加载header-home.php文件,为你的关于页面加载另一个文件(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 */ ?gt;
然后,生成的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 的值(当值为空或 "默认"时为null)。如果一个页面被分配了一个自定义模板,该模板的文件名将被存储为一个名为"_wp_page_template"的自定义字段的值(在wp_postmeta数据库表中)。(以下划线开头的自定义字段不会显示在编辑界面的自定义字段模块中。)