WordPress主題開發(fā)教程手冊(cè) — 模版文件繼承規(guī)則
本文詳細(xì)介紹了WordPress主題開發(fā)中的模板文件繼承規(guī)則,解釋了如何通過模板層次結(jié)構(gòu)確定頁面顯示的文件。文章還提供了如何自定義模板文件以優(yōu)化特定頁面顯示的實(shí)用指南,適合希望深入了解WordPress主題定制的開發(fā)者閱讀。
如上所述, 模板文件是模塊化的、可重用的文件,用于在 WordPress 網(wǎng)站上生成網(wǎng)頁。某些模板文件(例如頁眉和頁腳模板)用于您網(wǎng)站的所有頁面,而其他模板文件僅在特定條件下使用。
本文介紹 了 WordPress 如何確定在各個(gè)頁面上使用的模板文件 。如果要自定義現(xiàn)有的WordPress主題,這將幫助我們確定需要編輯哪個(gè)模板文件。我們還可以使用條件標(biāo)簽來控制在頁面上加載的模板。
模板文件層次結(jié)構(gòu)
摘要
WordPress 使用查詢字符串來決定應(yīng)該使用哪個(gè)模板來顯示頁面。查詢字符串是包含在網(wǎng)站每個(gè)部分的鏈接中的信息。它出現(xiàn)在初始問號(hào)之后,可能包含許多由&符號(hào)分隔的參數(shù)。
簡而言之,WordPress 向下搜索模板層次結(jié)構(gòu),直到找到匹配的模板文件。要確定要使用的模板文件,WordPress:
- 將每個(gè)查詢字符串與查詢類型匹配,來確定用戶請(qǐng)求的是哪種類型的頁面(例如,搜索頁面,類別頁面等);
- 按模板層次結(jié)構(gòu)確定使用哪個(gè)模板文件來顯示這個(gè)頁面。
- 在當(dāng)前主題的目錄中查找具有特定名稱的模板文件,并使用層次結(jié)構(gòu)指定的 第一個(gè)匹配模板文件 。
除了基本 index.php模板文件外,我們可以自定義使用其他模板文件來顯示頁面。
如果 WordPress 找不到名稱匹配的具體模板文件,它將跳轉(zhuǎn)到層次結(jié)構(gòu)中的下一個(gè)文件。如果 WordPress 還是找不到任何匹配的模板文件,最終將使用index.php 模板來顯示頁面。
示例
舉個(gè)例子,用戶在你的網(wǎng)站上打開了分類目錄存檔頁面:http://example.com/blog/category/your-cat/ ,WordPress 會(huì)在當(dāng)前主題的目錄中查找與該類別的 ID 匹配的模板文件,以生成正確的頁面。更具體地說,WordPress 遵循以下過程:
- 在當(dāng)前主題的目錄中查找與分類 slug 匹配的模板文件。如果分類 slug 是“unicorns”,則 WordPress 會(huì)查找名為的模板文件
category-unicorns.php。 - 如果
category-unicorns.php不存在,并且分類的 ID 為 4,則WordPress 將查找名為的模板文件category-4.php。 - 如果
category-4.php不存在,WordPress 將尋找通用分類模板文件,category.php。 - 如果
category.php不存在,WordPress 將尋找通用存檔模板archive.php。 - 如果
archive.php仍然還缺少,WordPress 將會(huì)使用主題 index.php 模板。
可視化概述
下圖是 WordPress 模板層次結(jié)構(gòu)中,調(diào)用模板文件來生成頁面的順序。

層次結(jié)構(gòu)詳細(xì)信息
雖然通過圖表更容易理解,我們還是在下面用文字描述一下各種查詢調(diào)用模板文件的順序。
主頁顯示
默認(rèn)情況下,WordPress 會(huì)在我們的網(wǎng)站首頁顯示網(wǎng)站的最新文章,這個(gè)頁面稱為文章索引。除此之外,選擇一個(gè)靜態(tài)頁面作為網(wǎng)站首頁。模板文件 home.php 用于顯示文章索引,無論我們選擇最新文章還是靜態(tài)頁面作為我們的首頁。如果 home.php 不存在,WordPress 將使用 index.php。
home.phpindex.php
如果 front-page.php存在,它將覆蓋 home.php模板。
首頁顯示
front-page.php 模版文件是 WordPress 優(yōu)先查找的首頁模版文件,。該模版優(yōu)先于 home.php模板。如果該front-page.php文件不存在,WordPress 將使用 home.php或 page.php文件,具體取決于設(shè)置→閱讀中的設(shè)置。如果這兩個(gè)文件都不存在,最終使用 index.php文件。
front-page.php– 設(shè)置→閱讀的 首頁顯示 中設(shè)置的“ 您的最新帖子 ”或“ 靜態(tài)頁面 ” 時(shí),優(yōu)先使用此模版文件 。home.php– 如果 WordPress 找不到 front-page.php,并且在 首頁顯示 設(shè)置了“您的最新文章”,WordPress 將查找 home.php。此外,當(dāng)在首頁顯示部分設(shè)置文章頁面時(shí),WordPress 將查找此文件。page.php– 在 首頁顯示 部分 設(shè)置“ 首頁 ”時(shí) 。index.php– 首頁顯示 設(shè)置為“ 你最新的文章 ”,但home.php不存在,或者設(shè)置了首頁,但page.php不存在時(shí),使用此模版文件。
如我們上面看到的,WordPress 確定模板的路徑有很多,使用上面的圖表是確定WordPress 將采用哪個(gè)模板文件的最佳方式。
單文章頁面
單文章模板用來顯示某一篇文章。
single-{post-type}-{slug}.php– (從 4.4 開始)首先,WordPress 會(huì)查找特定文章的模板。例如,如果 文章類型 是product,并且文章別名是dmc-12,WordPress 會(huì)尋找single-product-dmc-12.php。single-{post-type}.php– 如果文章類型是product,WordPress會(huì)尋找single-product.php。single.php– 然后 WordPress 回退到single.php。singular.php– 然后又回退到singular.php。index.php– 最后,WordPress 將回退到index.php。
單頁
用于呈現(xiàn)靜態(tài)頁面的模板文件( 頁面文章類型)。 頁面在 WordPress 中是一個(gè)特殊的文章類型,使用以下路徑來查找模版文件:
自定義模版文件– 在 WordPress 后臺(tái)選擇的 頁面模板 。見get_page_templates()page-{slug}.php– 如果頁面 slug 是recent-news,WordPress 將使用page-recent-news.php。page-{id}.php– 如果頁面 ID 為 6,WordPress 將使用page-6.php。page.phpsingular.phpindex.php
分類目錄
WordPress 使用以下層次結(jié)構(gòu)來渲染分類目錄頁面。
category-{slug}.php– 如果分類目錄的別名是news,WordPress 將查找category-news.php。category-{id}.php– 如果類別的 ID 是6,WordPress 將查找category-6.php。category.phparchive.phpindex.php
標(biāo)簽
要顯示標(biāo)簽存檔頁面,WordPress 使用以下路徑:
tag-{slug}.php– 如果標(biāo)簽的 slug 是sometag,WordPress 將查找tag-sometag.php。tag-{id}.php– 如果標(biāo)簽的ID是6,WordPress將查找tag-6.php。tag.phparchive.phpindex.php
自定義分類
WordPress 查找自定義分類法模板文件路徑的方法稍微不同:
taxonomy-{taxonomy}-{term}.php– 如果分類法是sometax,而分類法項(xiàng)目是someterm,則 WordPress 會(huì)查找taxonomy-sometax-someterm.php.在文章格式的情況下 ,分類法是 ‘post_format’,分類法項(xiàng)目是 ‘post-format- {format}。即taxonomy-post_format-post-format-link.php鏈接格式。taxonomy-{taxonomy}.php– 如果分類法是sometax,WordPress查找taxonomy-sometax.php。taxonomy.phparchive.phpindex.php
自定義文章類型
自定義文章類型使用以下路徑來呈現(xiàn)相應(yīng)的存檔頁面。
archive-{post_type}.php– 如果帖子類型是product,WordPress將尋找archive-product.php。archive.phpindex.php
(要渲染單個(gè)文章類型模板,請(qǐng)參閱 上面的單個(gè)文章顯示部分。)
作者顯示
基于以上示例,呈現(xiàn)作者存檔頁面的層次結(jié)構(gòu)顯而易見:
author-{nicename}.php– 如果作者的名字很好matt,WordPress 將尋找author-matt.php。author-{id}.php– 如果作者的 ID 是6,WordPress 將尋找author-6.php。author.phparchive.phpindex.php
日期
基于日期的存檔頁面按照以下路徑查找模版:
date.phparchive.phpindex.php
搜索結(jié)果
搜索結(jié)果遵循與其他模板類型相同的模式:
search.phpindex.php
404(未找到)
同樣,按以下順序調(diào)用 404 模板文件:
404.phpindex.php
附件
呈現(xiàn)附件頁面(attachment文章類型)使用以下路徑:
{MIME-type}.php-可以是任何 MIME類型(例如:image.php,video.php,pdf.php)。對(duì)于text/plain,使用以下路徑(按順序):text-plain.phpplain.phptext.php
attachment.phpsingle-attachment-{slug}.php– 例如,如果附件的 slug是holiday,WordPress 會(huì)查找single-attachment-holiday.php。single-attachment.phpsingle.phpsingular.phpindex.php
嵌入功能
嵌入模板文件用于渲染嵌入到其他頁面或網(wǎng)站的文章。從 4.5 開始,WordPress 使用以下路徑:
embed-{post-type}-{post_format}.php– 首先,WordPress 查找特定文章類型的模板。例如,如果一篇文章的文章類型是post并且格式為音頻格式,WordPress 會(huì)查準(zhǔn)embed-post-audio.php。embed-{post-type}.php– 如果文章類型是product,WordPress 會(huì)查找embed-product.php。embed.php– 最后 WordPress 將使用embed.php。- 最后,WordPress 最終回退到內(nèi)置的
wp-includes/theme-compat/embed.php模板。
非 ASCII 字符的處理方法
從 WordPress 4.7 開始,模板名稱的任何動(dòng)態(tài)部分(其名稱中包含非 ASCII 字符)實(shí)際上都支持未編碼和已編碼的形式。我們可以選擇使用任意一個(gè)。
下面是名為 “Hello World??” 的頁面的頁面模板層次結(jié)構(gòu),其 ID 為 6 :
page-hello-world-??.phppage-hello-world-%f0%9f%98%80.phppage-6.phppage.phpsingular.php
以上規(guī)則同樣適用于 post slugs,term names 和 author nicenames。
過濾層次結(jié)構(gòu)
WordPress 模板系統(tǒng)允許我們使用過濾器修改模版層次結(jié)構(gòu)。這意味著我們可以在層次結(jié)構(gòu)的特定點(diǎn)插入和更改內(nèi)容。過濾器(位于 get_query_template() 函數(shù)中)使用過濾器 “{$type}_template” ,其中 $type 是模板類型。
下面是模版層次結(jié)構(gòu)中,所有可用過濾器的列表:
embed_template404_templatesearch_templatefrontpage_templatehome_templatetaxonomy_templateattachment_templatesingle_templatepage_templatesingular_templatecategory_templatetag_templateauthor_templatedate_templatearchive_templateindex_template
示例
例如,默認(rèn)的作者存檔模版層次結(jié)構(gòu)如下:
author-{nicename}.phpauthor-{id}.phpauthor.php
我們想在 author.php 之前添加一個(gè) author-{role}.php ,來針對(duì)某個(gè)角色設(shè)置指定的模版文件,我們可以使用 ‘author_template’ 模板過濾器來修改作者存檔模版的層次結(jié)構(gòu)。當(dāng)用戶打開 /author/username 頁面時(shí),WordPress 會(huì)自動(dòng)調(diào)用角色存檔模版,其中 username 為「編輯」角色,這個(gè)頁面將使用 author-editor.php 顯示(如果存在于當(dāng)前主題目錄中)。
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' );