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:

  1. 將每個(gè)查詢字符串與查詢類型匹配,來確定用戶請(qǐng)求的是哪種類型的頁面(例如,搜索頁面,類別頁面等);
  2. 按模板層次結(jié)構(gòu)確定使用哪個(gè)模板文件來顯示這個(gè)頁面。
  3. 在當(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 遵循以下過程:

  1. 在當(dāng)前主題的目錄中查找與分類 slug 匹配的模板文件。如果分類 slug 是“unicorns”,則 WordPress 會(huì)查找名為的模板文件 category-unicorns.php。
  2. 如果 category-unicorns.php不存在,并且分類的 ID 為 4,則WordPress 將查找名為的模板文件 category-4.php 。
  3. 如果 category-4.php不存在,WordPress 將尋找通用分類模板文件, category.php。
  4. 如果 category.php不存在,WordPress 將尋找通用存檔模板  archive.php
  5. 如果 archive.php仍然還缺少,WordPress 將會(huì)使用主題 index.php 模板。

可視化概述

下圖是 WordPress 模板層次結(jié)構(gòu)中,調(diào)用模板文件來生成頁面的順序。

您還 可以與此圖表進(jìn)行交互 

層次結(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。

  1. home.php
  2. index.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文件。

  1. front-page.php– 設(shè)置→閱讀的 首頁顯示 中設(shè)置的“ 您的最新帖子 ”或“ 靜態(tài)頁面 ” 時(shí),優(yōu)先使用此模版文件 。
  2. home.php– 如果 WordPress 找不到 front-page.php,并且在 首頁顯示 設(shè)置了“您的最新文章”,WordPress 將查找 home.php。此外,當(dāng)在首頁顯示部分設(shè)置文章頁面時(shí),WordPress 將查找此文件。 
  3. page.php– 在 首頁顯示 部分 設(shè)置“ 首頁 ”時(shí) 。
  4. index.php– 首頁顯示 設(shè)置為“ 你最新的文章 ”,但 home.php不存在,或者設(shè)置了首頁,但 page.php不存在時(shí),使用此模版文件。

如我們上面看到的,WordPress 確定模板的路徑有很多,使用上面的圖表是確定WordPress 將采用哪個(gè)模板文件的最佳方式。

單文章頁面

單文章模板用來顯示某一篇文章。

  1. single-{post-type}-{slug}.php– (從 4.4 開始)首先,WordPress 會(huì)查找特定文章的模板。例如,如果 文章類型 是 product,并且文章別名是dmc-12,WordPress 會(huì)尋找 single-product-dmc-12.php。
  2. single-{post-type}.php– 如果文章類型是 product,WordPress會(huì)尋找 single-product.php
  3. single.php– 然后 WordPress 回退到 single.php。
  4. singular.php– 然后又回退到 singular.php
  5. index.php– 最后,WordPress 將回退到 index.php。

單頁

用于呈現(xiàn)靜態(tài)頁面的模板文件( 頁面文章類型)。 頁面在 WordPress 中是一個(gè)特殊的文章類型,使用以下路徑來查找模版文件:

  1. 自定義模版文件– 在 WordPress 后臺(tái)選擇的 頁面模板 。見 get_page_templates()
  2. page-{slug}.php– 如果頁面 slug 是 recent-news,WordPress 將使用 page-recent-news.php。
  3. page-{id}.php– 如果頁面 ID 為 6,WordPress 將使用 page-6.php
  4. page.php
  5. singular.php
  6. index.php

分類目錄

WordPress 使用以下層次結(jié)構(gòu)來渲染分類目錄頁面。

  1. category-{slug}.php– 如果分類目錄的別名是 news,WordPress 將查找 category-news.php
  2. category-{id}.php– 如果類別的 ID 是 6,WordPress 將查找 category-6.php 。
  3. category.php
  4. archive.php
  5. index.php

標(biāo)簽

要顯示標(biāo)簽存檔頁面,WordPress 使用以下路徑:

  1. tag-{slug}.php– 如果標(biāo)簽的 slug 是 sometag,WordPress 將查找 tag-sometag.php
  2. tag-{id}.php– 如果標(biāo)簽的ID是 6,WordPress將查找 tag-6.php。
  3. tag.php
  4. archive.php
  5. index.php

自定義分類

WordPress 查找自定義分類法模板文件路徑的方法稍微不同:

  1. 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 鏈接格式。
  2. taxonomy-{taxonomy}.php – 如果分類法是 sometax ,WordPress查找 taxonomy-sometax.php 。
  3. taxonomy.php
  4. archive.php
  5. index.php

自定義文章類型

自定義文章類型使用以下路徑來呈現(xiàn)相應(yīng)的存檔頁面。

  1. archive-{post_type}.php– 如果帖子類型是 product,WordPress將尋找 archive-product.php。
  2. archive.php
  3. index.php

(要渲染單個(gè)文章類型模板,請(qǐng)參閱 上面的單個(gè)文章顯示部分。)

作者顯示

基于以上示例,呈現(xiàn)作者存檔頁面的層次結(jié)構(gòu)顯而易見:

  1. author-{nicename}.php – 如果作者的名字很好 matt,WordPress 將尋找 author-matt.php。
  2. author-{id}.php – 如果作者的 ID 是 6,WordPress 將尋找 author-6.php。
  3. author.php
  4. archive.php
  5. index.php

日期

基于日期的存檔頁面按照以下路徑查找模版:

  1. date.php
  2. archive.php
  3. index.php

搜索結(jié)果

搜索結(jié)果遵循與其他模板類型相同的模式:

  1. search.php
  2. index.php

404(未找到)

同樣,按以下順序調(diào)用 404 模板文件:

  1. 404.php
  2. index.php

附件

呈現(xiàn)附件頁面(attachment文章類型)使用以下路徑:

  1. {MIME-type}.php -可以是任何 MIME類型(例如: image.php , video.php , pdf.php )。對(duì)于 text/plain ,使用以下路徑(按順序):
    1. text-plain.php
    2. plain.php
    3. text.php
  2. attachment.php
  3. single-attachment-{slug}.php – 例如,如果附件的 slug是 holiday ,WordPress 會(huì)查找 single-attachment-holiday.php 。
  4. single-attachment.php
  5. single.php
  6. singular.php
  7. index.php

嵌入功能

嵌入模板文件用于渲染嵌入到其他頁面或網(wǎng)站的文章。從 4.5 開始,WordPress 使用以下路徑:

  1. embed-{post-type}-{post_format}.php – 首先,WordPress 查找特定文章類型的模板。例如,如果一篇文章的文章類型是 post并且格式為音頻格式,WordPress 會(huì)查準(zhǔn) embed-post-audio.php。
  2. embed-{post-type}.php– 如果文章類型是 product,WordPress 會(huì)查找 embed-product.php 。
  3. embed.php– 最后 WordPress 將使用 embed.php 
  4. 最后,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 為 

  • page-hello-world-??.php
  • page-hello-world-%f0%9f%98%80.php
  • page-6.php
  • page.php
  • singular.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_template
  • 404_template
  • search_template
  • frontpage_template
  • home_template
  • taxonomy_template
  • attachment_template
  • single_template
  • page_template
  • singular_template
  • category_template
  • tag_template
  • author_template
  • date_template
  • archive_template
  • index_template

示例

例如,默認(rèn)的作者存檔模版層次結(jié)構(gòu)如下:

  • author-{nicename}.php
  • author-{id}.php
  • author.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' );

我們提供 WordPress主題和插件定制開發(fā)服務(wù)

本站長期承接 WordPress主題、插件、基于 WooCommerce 的商店商城開發(fā)業(yè)務(wù)。 我們有 10 年WordPress開發(fā)經(jīng)驗(yàn),如果你想 用WordPress開發(fā)網(wǎng)站, 請(qǐng)聯(lián)系微信: iwillhappy1314,或郵箱: [email protected] 咨詢。

發(fā)表回復(fù)

您的郵箱地址不會(huì)被公開。 必填項(xiàng)已用 * 標(biāo)注

*