WordPress模板的定義非常方便,但是在定制模板之前,我們有必要知道WordPress的模板層次,了解WordPress是如何加載模板文件的,這將有利于開發模板時合理利用資源及提高工作效率。
萬能的index.php
我們知道一個最簡單的WordPress主題只需要?style.css?和?index.php?文件即可。這代表著?index.php?可以是任何一個頁面的模板,無論是首頁,還是文章頁,或是分類頁,再或者是搜索結果頁面,它都能完美勝任。
也就是說,當對應的模板不存在時,?index.php?將是WordPress最后的底牌。
模板加載順序
下面讓我們來了解一下WordPress都是怎么加載模板的
首頁
- 首先WordPress會先檢查是否有靜態首頁,如果有靜態首頁,就會加載這個頁面內容并通過?front-page.php?模板文件展示,如果沒有這個模板文件,就會通過頁面模板展示
- 如果沒有靜態首頁,就會加載?home.php??最新文章模板
- 如果沒有?home.php?則加載?index.php?模板
文章頁
- 首先被考慮的是?single-{post_type}.php?這樣一個模板文件(如文章類型是?product?那么對應的文件名就是?single-product.php?)
- 如果找不到,那么就會加載?single.php?模板
- 如果連?single.php?模板都沒有則加載?index.php?模板。
頁面
- 首先被考慮的是自定義模板,也就是編輯頁面時所選擇的模板
- 如果沒有自定義模板,則查找?page-{slug}.php?別名模板(如頁面別名是?about?對應的文件名就是?page-about.php?)
- 如果別名模板也沒有就查找?page-{id}.php?ID模板(如頁面ID是?2?對應的文件名就是?page-2.php?)
- 如果ID模板也沒有那就是?page.php?模板了
- 如果連?page.php?模板都沒有則加載?index.php?模板
分類頁
- 首先被考慮的是?category-{slug}.php?別名模板(如分類別名是?news?對應的文件名就是?category-news.php?)
- 如果沒有別名模板則查找?category-{id}.php?ID模板(如分類ID是?1?對應的文件名就是?category-1.php?)
- 如果ID模板也沒有那就是?category.php?分類模板了
- 如果?category.php?分類模板也沒有則加載?archive.php?通用歸檔模板
- 如果連?archive.php?通用歸檔模板都沒有則加載?index.php?模板
標簽頁
標簽頁模板加載順序和分類頁一樣,只不過前綴不過?category?而是?tag?(如?tag-{slug}.php)。
自定義分類法
有時候除了WordPress默認的分類目錄和標簽我們還需要其他的分類方法,這時候我們就會注冊一個新的分類法,那么在此之前知道分類法的模板加載順序也是十分必要的。以下說明假設自定義分類法是?people?這個名字:
- 分類法分類頁首先被考慮的是?taxonomy-{taxonomy}-{term}.php?別名模板(如分類別名?teacher?對應的文件名就是?taxonomy-people-teacher.php?)
- 如果沒有別名模板,則加載該分類法歸檔頁(如?taxonomy-people.php?)
- 如果分類法歸檔頁模板也沒有則加載?archive.php?通用歸檔模板
- 如果連?archive.php?通用歸檔模板都沒有則加載?index.php?模板
自定義文章類型
除了自定義分類法,有時候我們也需要自定義文章類型:
- 自定義文章類型歸檔頁首先被考慮的是?archive-{post_type}.php?別名模板(如文章類型是?product?那么對應的文件名就是?archive-product.php?)
- 如果沒有別名模板則加載?archive.php?通用歸檔模板
- 如果連?archive.php?通用歸檔模板都沒有則加載?index.php?模板
作者歸檔頁
- 首先被考慮的是?author-{nicename}.php?別名模板(如作者用戶名是?steven?那么對應的文件名就是?author-steven.php?)
- 如果沒有別名模板則加載?author-{id}.php?ID模板(如作者ID是?1?對應的文件名就是?author-1.php?)
- 如果ID模板沒有則加載?author.php?通用作者模板
- 如果通用作者模板也沒有則加載?archive.php?通用歸檔模板
- 如果連?archive.php?通用歸檔模板都沒有則加載?index.php?模板
日期歸檔頁
- 首先被考慮的是?date.php?日期歸檔模板
- 如果日期歸檔模板沒有則加載?archive.php?通用歸檔模板
- 如果連?archive.php?通用歸檔模板都沒有則加載?index.php?模板
搜索結果頁
- 首先被考慮的是?search.php?搜索結果模板
- 如果沒有搜索結果模板則加載?index.php?模板
附件頁
- 首先會按MIME類型加載模板(如?image.php,?video.php,?application.php,而?text/plain?類型則按順序嘗試加載?text.php,?plain.php,?text_plain.php?這三個文件。
- 如果沒有對應的MIME類型模板則?attachment.php?附件模板(如沒有?attachment.php?則加載?single-attachment.php?)
- 如果沒有附件模板則加載?single.php?文章頁模板
- 如果連?single.php?文章頁模板都沒有則加載?index.php?模板
模板層次圖
上面用文字詳細講述了WordPress模板的加載順序,盡管詳細,但還不如一張信息圖更為直觀,以下就是WordPress的模板層次結構圖。

使用鉤子修改模板
在某些使用場景(如插件),我們并不能直接修改模板文件,這時候我們可以使用鉤子來實現修改模板文件,鉤子名稱是?{$type}_template?這樣的格式,以下是對應的完整的鉤子名稱列表:
- 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
以下是一個使用例子(讓頁面加載?single.php?文章頁的模板):
function page_template_filter( $templates='' ){
$templates=locate_template("single.php",false);
return $templates;
}
add_filter( 'page_template', 'page_template_filter' );
模板頁面判斷
一般情況下,在一個特定的模板中我們能清楚知道應該怎么輸出特定的樣式和內容,但在一些通用模板中(如?header.php?)我們想要知道用戶當前訪問的是哪個頁面模板就需要借助WordPress內置的條件判斷函數了,這些函數可以幫助我們判斷當前是什么頁面以方便加載不同的模板內容,如?is_home()?則是判斷首頁的條件標簽,is_single()?則是判斷文章頁的條件標簽,等等。