页面模板是可以应用于特定页面或一组页面的特定类型的模板文件。 >[warning] 注意:自WordPress 4.7页面模板支持所有帖子类型。 有关如何将页面模板设置为特定帖子类型的详细信息,请参阅下面的示例。 由于页面模板是特定类型的模板文件,因此页面模板的一些区别特征如下: - 页面模板用于更改页面的外观和感觉。 - 页面模板可以应用于单个页面,页面部分或一类页面。 - 页面模板通常具有高度的特异性,针对单个页面或一组页面。 例如,名为page-about.php的页面模板比模板文件page.php或index.php更具体,因为它只会影响具有“about”的页面。 - 如果页面模板具有模板名称,则编辑页面的WordPress用户可以控制将用于渲染页面的模板。 ## 用户页面模板 页面模板在网页上显示您网站的动态内容,例如帖子,新闻更新,日历活动,媒体文件等。您可以决定您希望您的主页以特定的方式查看,这与您网站的其他部分完全不同 。 或者,您可能希望显示链接到页面一部分上的帖子的精选图片,还有其他地方的最新帖子列表,并使用自定义导航。 您可以使用页面模板来实现这些功能。 本节介绍如何构建可由用户通过其管理屏幕选择的页面模板。 例如,您可以构建页面模板: - full-width, 一列 - two-column 右边是一个侧边栏 - two-column 左侧有一个侧边栏 - three-column 三列 ## 模板层次结构中的页面模板 当某人浏览您的网站时,WordPress将选择用于呈现该页面的模板。正如我们之前在模板层次结构中学到的,WordPress按以下顺序查找模板文件: - 页面模板 - 如果页面具有分配的自定义模板,则WordPress会查找该文件,如果找到,则使用它。 - page- {slug} .php - 如果没有分配自定义模板,WordPress将查找并使用包含该页面的块的专门模板。 - page- {id} .php - 如果没有找到包含页面小插件的专门模板,WordPress会查找并使用以该页面的ID命名的专用模板。 - page.php - 如果没有找到包含页面ID的专用模板,WordPress会查找并使用主题的默认页面模板。 - singular.php - 如果没有找到page.php,WordPress将查找并使用用于单个帖子的主题模板,不考虑帖子类型。 - index.php - 如果没有指定或找到特定的页面模板,WordPress将默认使用主题的索引文件来呈现页面。 >[info] 警告:还有一个名为paged.php的WordPress定义的模板。 它不用于页面类型,而是用于显示多个存档页面。 ## 页面模板用途和用户控制 如果您计划为主题制作自定义页面模板,则应在继续操作之前决定一些事情: 页面模板是否用于特定页面或任何页面;和 您想要为模板提供哪种类型的用户控件。 创建或编辑页面时,用户可以选择具有模板名称的每个页面模板。可以在“页面”>“添加新建”>“属性”>“模板”中找到可用模板列表。因此,WordPress用户可以选择任何具有模板名称的页面模板,这可能不是您的意图。 例如,如果您想要为“关于”页面设置一个特定的模板,可能不适合将该页面模板命名为“关于模板”,因为它可以在全局范围内对所有页面(即用户可以将其应用于任何页)。相反,只要用户访问“关于”页面,创建单一使用模板,WordPress将使用适当的模板呈现页面。 相反,许多主题都包括选择页面将有多少列的能力。这些选项中的每一个都是全球可用的页面模板。为了让您的WordPress用户使用此全局选项,您将需要为每个选项创建页面模板,并为每个选项提供一个模板名称。 判断一个模板是全局使用还是单一使用是通过文件的命名方式来实现的,以及是否有特定的注释。 >[warning] 注意:有时候,模板全局可用,即使它似乎是一个单一的用例也是合适的。 当您创建发布主题时,可能很难预测用户对其页面的名称。 投资组合页面是一个很好的例子,因为并不是每个WordPress用户都将他们的投资组合命名为相同的东西或具有相同的页面ID,但他们可能想要使用该模板。 ## 页面模板的文件组织 如主题文件组织中所述WordPress识别子文件夹页面模板。 因此,将全局页面模板存储在此文件夹中是一个好主意,以帮助保持组织。 >[info] 警报:专门的页面模板文件(仅一次使用的文件)不能在子文件夹中,也不能在父主题文件夹中使用子主题。 ## 创建全局使用的自定义页面模板 有时你会想要一个可以在任何页面或多个页面全局使用的模板。 一些开发人员将使用文件名前缀对其模板进行分组,例如page_two-columns.php >[danger] 警示:重要! 不要使用page-作为前缀,因为WordPress会将文件解释为专门的模板,仅适用于您网站上的一个页面。 有关不能使用的主题文件命名约定和文件名的信息,请参阅保留的[主题文件名](themes/template-files.md)。 >[warning] 提示:创建新页面模板的快速,安全的方法是创建一个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当您将文件上传到主题文件夹(例如页面模板)时,请转到管理信息中心的“页面”>“编辑”屏幕。 在右侧的属性下,您将看到模板。 用户可以访问全局页面模板。 >[warning] 提示:选择列表的最大宽度为250px,因此更长的名称可能会被切断。 ## 为一个特定页面创建自定义页面模板 如“模板层次”页面中所述,您可以为特定页面创建模板。 要创建一个特定页面的模板,请复制您现有的page.php文件,并用您的页面的插槽或ID重命名: - page-{slug} .php - page-{ID} .php >[warning] 例如:您的“关于”页面有“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... ``` >[info] 警报:只有从WordPress 4.7才支持将页面模板添加到“page”以外的帖子类型的功能 当一个帖子类型至少存在一个模板时,“Post Attributes”元框将显示在后端,而不需要为“page-attributes”或其他任何东西添加post类型的支持。 “Post Attributes”标签可以在注册一个帖子类型时使用“attributes”标签定制每个帖子类型。 向后兼容性: 假设您想公开发布支持帖子类型模板的主题。 4.7之前的WordPress版本将忽略模板帖子类型标题,并在页面模板列表中显示模板,即使它仅适用于常规帖子。 为了防止这种情况,您可以挂接到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及更高版本中支持自定义帖子类型模板,同时保持完全向后兼容性。 >[warning]请注意,theme_page_templates实际上是一个动态主题_{$ post_type}_templates过滤器。 挂钩名称的动态部分$post_type是指模板支持的帖子类型。 例如。 您可以钩入theme_product_templates来过滤产品职位类型的模板列表。 ## 在页面模板中使用条件标签 您可以使用主题的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; ``` 您可以在此处了解有关[条件标签](themes/conditional-tags.md)的更多信息。 ## 识别页面模板 如果您的模板使用了body_class()函数,则WordPress将在文本类标题(页面),页面ID(page-id- {ID})以及所使用的页面模板的body标签中打印类。 对于默认的page.php,生成的类名称为page-template-default: ``` <body class="page page-id-6 page-template-default"> ``` >[warning] 注意:一个专门的模板(page- {slug} .php或page- {ID} .php)也获取了page-template-default类而不是其自己的body类。 当使用自定义页面模板时,将打印类页面模板以及命名特定模板的类。 例如,如果您的自定义页面模板文件命名如下: ``` <?php /* Template Name: My Custom Page */ ?> ``` 然后渲染HTML生成将如下所示: ``` <body class="page page-id-6 page-template page-template-my-custom-page-php"> ``` >[warning] 注意应用于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的值(当该值为空时为空或“默认值”)如果页面已分配了一个自定义模板,该模板的文件名将被存储为名为“_wp_page_template”的自定义字段的值 wp_postmeta数据库表)。 (自定义字段以下划线开头,不会显示在编辑屏幕的自定义字段模块中。)