用 get_template_part() 實踐模組化

作為內容管理系統,WordPress 將網站的個區塊透過類似積木的方式模組化。以佈景主題來說,header.php 便掌管了 <body> 以前的 HTML 代碼、footer.php 則掌管 <footer></body> 到最後 </html> 的代碼。

我們在 WordPress 客製化中常見的勾點 wp_headwp_footer 便是作用於這兩份檔案中。

頁面的主要內容,會先按照範本階級 (template hierarchy) 讀取頁面的範本檔,而在範本檔當中,我們便會看到 get_template_part() 這個函式。

基本語法

get_template_part( '路徑位置/檔名前綴', '代稱' );

// 從 WordPress 5.5 開始支援將參數傳遞至範本檔當中。
get_template_part( '路徑位置/檔名前綴', '代稱', array() );

以 WordPress 大部分的佈景主題為例,其 index.php 便會載入 get_template_part( 'template-parts/content', get_post_type() );。這段語法便會讀取 template-parts 資料夾中的 content-{{內容類型}}.php 檔案。

除了可以用來讀取主要內容的範本檔以外,也可以將頁面中的區段內容透過不同的範本檔儲存。以這次的公司網站改版為例,便將服務內容的區段儲存在 template-parts/section 中。

get_template_part() 的限制

根據 WordPress 的技術文件get_template_part() 會執行 get_template_part 這個勾點,在意義上等同於 PHP 中的 require(),因此 get_template_part() 的值不能存為變數。

這一點會特別記下來,是因為之前曾經試圖用 get_template_part() 的內容插入 wp_nav_menu()items_wrap 中,但沒有成功。

get_template_part() 對效能的影響

根據這篇文章的討論,get_template_part() 對效能並不會有太大的影響。雖然在執行上會增加讀寫的檔案數,但除非 template-parts 的範本檔案數量很多,且在頁面中大量使用 get_template_part() 來呼叫範本,不然對效能造成負面影響。

順手整理一下主要原因:get_template_part() 使用了 locate_template() 這個方法去偵測範本檔是否存在,而 locate_template() 使用了 foreach()file_exists() 兩種方法,按照順位存取範本檔。

file_exists() 的結果會自動快取於 PHP 之中,所以即使重複使用,對效能的影響也不會太大。

foreach() 這個方法,雖然有可能會造成效能變慢,但在大多數的情況下並不會影響效能。

結語

這次的公司網站改版,為了將頁面寫死,不去存取區塊編輯器的內容,因此將每個頁面的內容藉由範本的方式儲存,也因而更了解 get_template_part() 的機制。

透過 get_template_part(),可以將不同的版面配置模組化,並且更有效率的在不同的情境下使用。

預設圖片
Eric Chuang
正職是廣告行銷人員,因為 Google Tag Manager 的關係開始踏入網站製作的領域,進一步把 WordPress 當成 PHP + HTML + CSS + JavaScript 的學習教材。此外,因為工作的關係,曾經用 Automattic 的 Underscores (_s) 替客戶與公司官網進行全客製化佈景主題開發。

發佈留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124