如所討論的,模板文件是模塊化的,可重復使用的文件,用于在WordPress站點上生成網頁。 一些模板文件(如頁眉和頁腳模板)用于所有網站的頁面,而其他模板文件僅在特定條件下使用。
本文解釋WordPress如何確定在單個頁面上使用哪個模板文件。 如果要自定義現有的WordPress主題,它將幫助您確定需要編輯的模板文件。
>[warning] 提示:您還可以使用條件標簽來控制在特定頁面上加載哪些模板。
# 模板文件層次結構
## 概述
WordPress使用查詢字符串來決定哪個模板或一組模板應用于顯示頁面。查詢字符串是指向您網站每個部分的鏈接中的信息。它來自初始問號,可能包含多個由&符號分隔的參數。
簡單地說,WordPress通過模板層次結構搜索,直到找到匹配的模板文件。要確定使用哪個模板文件,WordPress:
- 將每個查詢字符串匹配到查詢類型以確定正在請求哪個頁面(例如,搜索頁面,類別頁面等);
- 按照模板層次結構確定的順序選擇模板;
- 在當前主題的目錄中查找具有特定名稱的模板文件,并使用層次結構指定的第一個匹配的模板文件。
- 除了基本的index.php模板文件外,您可以選擇是否要實現特定的模板文件。
如果WordPress找不到具有匹配名稱的模板文件,它將跳到層次結構中的下一個文件。如果WordPress找不到任何匹配的模板文件,將使用主題的index.php文件。
### 示例
如果您的博客位于http://example.com/blog/ ,訪問者點擊鏈接到類別頁面(例如http://example.com/blog/category/your-cat/) ,WordPress會查找模板 在當前主題的目錄中匹配類別的ID以生成正確的頁面。 更具體地說,WordPress遵循以下過程:
- 在當前主題的目錄中查找與該類別的插件匹配的模板文件。 如果類別slug是“unicorns”,則WordPress會查找名為category-unicorns.php的模板文件。
- 如果category-unicorns.php缺少且類別的ID為4,則WordPress將查找名為category-4.php的模板文件。
- 如果缺少類別4.php,WordPress將尋找一個通用類別模板文件category.php。
- 如果category.php不存在,WordPress將尋找一個通用歸檔模板archive.php。
- 如果archive.php也丟失,WordPress將回到主題模板文件index.php。
## 視覺概述
下圖顯示了哪些模板文件被調用以基于WordPress模板層次結構生成WordPress頁面。

您也可以與[此圖交互](https://wphierarchy.com)。
## 模板層次詳細
雖然模板層次結構更容易被理解為圖表,但以下部分描述了WordPress為多種查詢類型調用模板文件的順序。
## 主頁顯示
默認情況下,WordPress設置您的網站的主頁以顯示最新的博文。 這個頁面被稱為博客帖子索引。 您也可以將您的博客帖子設置為在單獨的靜態頁面上顯示。 模板文件home.php用于呈現博客帖子索引,無論是用作首頁還是單獨的靜態頁面。 如果home.php不存在,WordPress將使用index.php。
- home.php
- index.php
>[warning] 注意:如果front-page.php存在,它將覆蓋home.php模板。
## 首頁
front-page.php模板文件用于呈現您網站的首頁,首頁是否顯示博客帖子索引(如上所述)或靜態頁面。 首頁模板優先于博客帖子索引(home.php)模板。 如果front-page.php文件不存在,WordPress將根據設置→閱讀中的設置使用home.php或page.php文件。 如果這兩個文件都不存在,它將使用index.php文件。
- front-page.php - 用于首頁顯示設置→閱讀部分中的“您的最新帖子”或“靜態頁面”。
- home.php - 如果WordPress找不到front-page.php和“你的最新帖子”設置在首頁顯示部分,它將尋找home.php。 此外,當在首頁顯示部分中設置帖子頁面時,WordPress將查找此文件。
- page.php - 在首頁顯示部分設置“首頁”時。
- index.php - 在首頁顯示部分設置“您的最新帖子”,但home.php不存在或者當首頁設置但page.php不存在時。
正如你所看到的,WordPress所采用的路徑有很多規則。 使用上面的圖表是確定WordPress將顯示的最佳方式。
## 單頁內容
單頁內容模板文件用于呈現單頁內容。 WordPress使用以下路徑:
- single-{post-type} - {slug} .php - (從4.4開始)首先,WordPress尋找特定內容的模板。 例如,如果內容類型是產品,并且post slug是dmc-12,則WordPress會查找單個產品dmc-12.php。
- single- {post-type} .php - 如果帖子類型是產品,WordPress將尋找單一product.php。
- single.php - WordPress然后回到single.php。
- singular.php - 然后它回到singular.php。
- index.php - 最后,如上所述,WordPress最終會回到index.php。
## 單頁
用于呈現靜態頁面的模板文件(頁面后置類型)。 請注意,與其他后期類型不同,頁面特別適用于WordPress,并使用以下修補程序:
自定義模板文件 - 分配給頁面的頁面模板。 請參閱get_page_templates()。
- page- {slug} .php - 如果該頁面是最新消息,WordPress將會使用page-recent-news.php。
- page- {id} .php - 如果頁面ID為6,WordPress將使用page-6.php。
- page.php
- singular.php
- index.php
## 類別
渲染類別歸檔索引頁在WordPress中使用以下路徑:
- category- {slug} .php - 如果類別的lug lug是新聞,WordPress將會查找category-news.php。
- category- {id} .php - 如果類別的ID為6,WordPress將尋找類別為6.php。
- category.php
- archive.php
- index.php
## 標簽
要顯示標簽歸檔索引頁面,WordPress使用以下路徑:
- tag- {slug} .php - 如果標簽的插件是某個標簽,WordPress將會查找tag-sometag.php。
- tag- {id} .php - 如果標簽的ID為6,WordPress將尋找標簽6.php。
- tag.php
- archive.php
- index.php
## 自定義分類
自定義分類使用稍微不同的模板文件路徑:
- taxonomy-{taxonomy}-{term}.php – 如果分類是某種類型,而分類學術語是某種語言,則WordPress將尋找分類法。 在發布格式的情況下,分類是“post_format”,術語是“post-format- {format}”。 即鏈接后期格式的taxonomy-post_format-post-format-link.php。
- taxonomy-{taxonomy}.php – 如果分類是多數,WordPress會尋找分類法 - sometax.php。
- taxonomy.php
- archive.php
- index.php
## 自定義內容類型
自定義帖子類型使用以下路徑呈現相應的歸檔索引頁面。
- archive- {post_type} .php - 如果帖子類型是產品,WordPress將尋找archive-product.php。
- archive.php
- index.php
> (要渲染單個帖子類型模板,請參閱上面的單個帖子顯示部分。)
## 作者顯示
基于上述示例,渲染作者存檔索引頁面是相當明確的:
- author- {nicename} .php - 如果作者的漂亮的名字是啞光,WordPress將尋找author-matt.php。
- author- {id} .php - 如果作者的ID為6,WordPress將尋找author-6.php。
- author.php
- archive.php
- index.php
## 日期
基于日期的歸檔索引頁面按照您預期的方式呈現:
- date.php
- archive.php
- index.php
## 搜索結果
搜索結果遵循與其他模板類型相同的模式:
- search.php
- index.php
## 404(找不到)
同樣,404模板文件按以下順序調用:
- 404.php
- index.php
## 附件
渲染附件頁面(附件類型)需要遵循以下路徑:
- MIME_type.php - 它可以是任何MIME類型(例如:image.php,video.php,application.php)。 對于text / plain,使用以下路徑(順序):
- text_plain.php
- plain.php
- text.php
- attachment.php
- single-attachment.php
- single.php
- index.php
## 嵌入模板
嵌入模板文件用于渲染正在嵌入的帖子。 自4.5以來,WordPress使用以下路徑:
- embed- {post-type} - {post_format} .php - 首先,WordPress尋找特定帖子的模板。 例如,如果其帖子類型是產品,并且具有音頻格式,則WordPress將尋找embed-product-audio.php。
- embed- {post-type} .php - 如果帖子類型是汽車,WordPress會尋找embed-car.php。
- embed.php - WordPress然后回到embed.php。
- 最后,WordPress最終還是回到wp-includes/theme-compat/embed.php
## 過濾層次結構
WordPress模板系統允許您過濾層次結構。 這意味著您可以在層次結構的特定點插入和更改東西。 過濾器(位于get_query_template()函數中)使用此過濾器名稱:“{$ type} _template”其中$ type是沒有.php擴展名的層次結構中的文件名。
以下是過濾器層次結構中所有模板類型的完整列表:
- index_template
- 404_template
- archive_template
- author_template
- category_template
- tag_template
- taxonomy_template
- date_template
- home_template
- front_page_template
- page_template
- paged_template
- search_template
- single_template
- text_template, plain_template, text_plain_template (all mime types)
- attachment_template
- comments_popup
- embed_template
### 示例
例如,讓我們采用默認的作者層次結構:
- author-{nicename}.php
- author-{id}.php
- author.php
要在author.php之前添加author- {role} .php,我們可以使用'author_template'模板類型來操作實際的層次結構。 這允許對/ author/username的請求,其中username具有編輯器的作用,使用author-editor.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' );
```
- 簡介
- 主題開發
- WordPress許可證
- 什么是主題
- 開發環境
- 主題開發示例
- 主題基礎
- 模板文件
- 主樣式表(style.css)
- 文章類型
- 規劃主題文件
- 模板層級
- 模板標簽
- 循環
- 主題函數
- 連接主題文件和目錄
- 使用CSS和JavaScript
- 條件標簽
- 類別,標簽和自定義分類
- 模板文件
- 內容模板文件
- 頁面模板文件
- 附件模板文件
- 自定義內容類型
- 部分和其他模板文件
- 評論模板
- 分類模板
- 404頁面
- 主題功能
- 核心支持的功能
- 管理菜單
- 自定義Headers
- 自定義Logo
- 文章格式
- 置頂文章
- Sidebars
- Widgets
- 導航菜單
- 分頁
- 媒體
- Audio
- Images
- Galleries
- Video
- 精選圖片和縮略圖
- 國際化
- 本地化
- 輔助功能
- 主題選項 – 自定義API
- 定制對象
- 改進用戶體驗的工具
- 定制JavaScript API
- JavaScript / Underscore.js渲染的自定義控件
- 高級用法
- 主題安全
- 數據消毒/逃避
- 數據驗證
- 使用隨機數
- 常見漏洞
- 高級主題
- 子主題
- UI最佳實踐
- JavaScript最佳做法
- 主題單元測試
- 驗證你的主題
- Plugin API Hooks
- 發布你的主題
- 所需的主題文件
- 測試
- 主題評論指南
- 寫文檔
- 提交你的主題到WordPress.org
- 參考文獻
- 模板標簽列表
- 條件標簽列表
- 編碼標準
- HTML編碼標準
- CSS編碼標準
- JavaScript編碼標準
- PHP編碼標準
- 插件開發
- 插件開發簡介
- 什么是插件
- 插件基礎
- 頭部要求
- 包括軟件許可證
- 啟用 / 停用 Hooks
- 卸載方法
- 最佳做法
- 插件安全
- 檢查用戶功能
- 數據驗證
- 保護輸入
- 保護輸出
- 隨機數
- Hooks
- Actions
- Filters
- 自定義Hooks
- 高級主題
- 管理菜單
- 頂級菜單
- 子菜單
- 短代碼
- 基本短碼
- 封閉短碼
- 帶參數的短代碼
- TinyMCE增強型短碼
- 設置
- 設置API
- 使用設置API
- 選項API
- 自定義設置頁面
- 元數據
- 管理帖子元數據
- 自定義元數據
- 渲染元數據
- 自定義文章類型
- 注冊自定義文章類型
- 使用自定義文章類型
- 分類
- 使用自定義分類
- 在WP 4.2+中使用“split術語”
- 用戶
- 創建和管理用戶
- 使用用戶元數據
- 角色和功能
- HTTP API
- JavaScript
- jQuery
- Ajax
- 服務器端PHP和入隊
- Heartbeat API
- 概要
- 計劃任務
- 了解WP-Cron計劃
- 安排WP-Cron 事件
- 將WP-Cron掛接到系統任務計劃程序中
- WP-Cron簡單測試
- 國際化
- 本地化
- 如何國際化您的插件
- 國際化安全
- WordPress.org
- 詳細插件指南
- 規劃您的插件
- 如何使用Subversion
- 插件開發者常見問題
- 開發工具
- Debug Bar 和附加組件
- 輔助插件
- REST API手冊
- 資源
- 文章
- 文章修訂
- 文章類型
- 文章狀態
- 類別
- 標簽
- 頁面
- 評論
- 分類
- 媒體
- 用戶
- 設置
- 使用REST API
- 全局參數
- 分頁
- 鏈接和嵌入
- 發現
- 認證
- 經常問的問題
- 骨干JavaScript客戶端
- 客戶端庫
- 擴展REST API
- 添加自定義端點
- 自定義內容類型
- 修改回應
- 模式
- 詞匯表
- 路由和端點
- 控制器類