同一個頁尾,你在十個範本裡各貼一次,改一次聯絡電話就要開十個檔案逐一修。樣板組件(Template Parts)就是為了終結這種重複勞動而存在的東西,它把頁首、頁尾、側邊欄這些「每頁都長一樣」的區塊抽成一個獨立單元,改一次,全站套用的地方一起更新。
問題是,WordPress 同時存在兩套樣板組件的世界:區塊主題(Block Theme)用視覺化的站台編輯器管理 .html 樣板組件,傳統主題(Classic Theme)則靠 PHP 函式 get_template_part() 載入 .php 檔案。兩者名字相近、概念相通,實作卻完全不同,很多教學只講其中一邊,讀者搞不清楚自己手上的主題該用哪套。這篇會把兩個世界一次講清楚,並帶到樣板組件和圖樣(Pattern)容易混淆的差別,以及實際在站台上拆解、重用時會踩到的雷。
樣板組件到底是什麼,跟整頁樣板差在哪
樣板組件是一個可重複使用的版面片段,代表網站結構中重複出現的區段,最典型的就是頁首、頁尾、側邊欄、留言區與文章中繼資料(post meta)。它不是內容本身(不像文章或頁面),而是包覆內容的外框。
要分清楚「樣板」(Template)和「樣板組件」(Template Part)兩個層級。樣板管的是一整頁的骨架,例如單篇文章用 single.html、靜態頁面用 page.html、彙整頁用 archive.html,它決定標題、內文、作者資訊、留言這些區域怎麼排。樣板組件則是樣板裡面被切出來的較小單元,一個樣板可以塞進多個樣板組件,同一個樣板組件也可以被多個樣板共用。
關鍵特性是同步。當你修改某個樣板組件裡的區塊,所有引用這個樣板組件的樣板都會跟著更新。所以只要你讓全站的範本都引用同一個頁首與頁尾樣板組件,要換 logo、改導覽選單、調整頁尾版權聲明時,只需要動一個地方。這正是它和「整頁樣板」最大的差別——樣板組件天生為了跨範本重用而設計,整頁樣板則是針對特定頁型的完整佈局。
區塊主題與傳統主題的樣板組件,運作邏輯完全不同
你手上的主題屬於哪一種,決定你接下來的所有操作方式,這是入門時最容易卡住的點。判斷方法很直接:到後台「外觀」選單下看有沒有「編輯器」(Editor)這個項目,有就是區塊主題,只有「自訂」(Customizer)通常就是傳統主題。
區塊主題的樣板組件是 .html 檔案,放在主題目錄的 parts/ 資料夾裡(例如 parts/header.html、parts/footer.html),內容是區塊標記(block markup)。它需要 WordPress 5.9 以上,並透過 theme.json 與站台編輯器來管理,完全不用寫 PHP 就能在後台拖拉編輯。
傳統主題的樣板組件則是 .php 檔案,靠 get_template_part() 這個函式在範本檔裡載入。它沒有視覺化編輯介面,要改版面得直接動程式碼。WordPress 官方主題慣例是把這類片段集中放在 template-parts/ 資料夾,方便管理。
兩套機制的核心目的一樣——把重複區段模組化、集中維護——但工作流天差地遠。區塊主題交給網站經營者用後台滑鼠操作,傳統主題則交給開發者用編輯器寫 PHP。下面兩節分別拆解。
在站台編輯器裡建立與編輯區塊主題的樣板組件
區塊主題的樣板組件全程在站台編輯器(Site Editor)內完成,不碰任何程式碼。進入路徑是後台「外觀」滑過去點「編輯器」,編輯器載入後,從側邊欄點「圖樣」(Patterns)項目,在分類底下就能看到目前主題提供的樣板組件清單。要注意每個主題提供的樣板組件不盡相同,有些主題會給兩個以上的頁首版本,例如首頁專用一個、其他頁面用另一個。
樣板組件依用途分成三類:
- 頁首(Header):頁面頂部區域,通常放網站標題、logo 與導覽選單,可以針對不同頁型做出多個變化版本。
- 頁尾(Footer):頁面底部區域,常見隱私權政策連結、版權聲明、網站地圖、社群圖示、聯絡資訊與電子報訂閱表單。
- 一般(General):不綁定特定區域的彈性類型,可跨頁面使用,側邊欄常用這類。
編輯既有樣板組件的流程是選定要改的樣板組件後,點鉛筆圖示進入編輯,左上角的清單檢視(List View)會攤開這個樣板組件由哪些區塊組成、怎麼層層排列。在清單檢視裡可以移動、刪除、新增區塊。改完按右上角藍色「儲存」按鈕,所有引用它的範本就同步更新。
新建一個樣板組件的方式是點「圖樣」標題旁的加號,下拉選單選「建立樣板組件」,跳出視窗讓你選類型(一般、頁首或頁尾,預設選一般),輸入名稱後按「建立」。接著會進入一個只剩樣板組件名稱的空白聚焦畫面,點右上角加號就能塞區塊或現成圖樣堆出想要的版面。一個省事的做法是直接從 WordPress.org 的圖樣目錄複製一個合適的圖樣,在編輯區按右鍵貼上,再微調設計。
把樣板組件插進範本要回到「樣板」清單挑一個範本,用清單檢視看它目前的結構,刪掉舊的樣板組件後點加號,搜尋「樣板組件」(Template Part)這個區塊加進來,再點「選擇」瀏覽站上所有樣板組件挑要用的那個,最後存檔。
一個實務提醒:在編輯區塊時若工具列出現「編輯原始檔」(Edit original),代表你正在改的是會全站同步的樣板組件本體,存下去會牽動每一個用到它的地方,動手前先確認這是你要的範圍。
傳統主題用 get_template_part() 做模組化的寫法
傳統主題沒有站台編輯器,靠的是 get_template_part() 這個 PHP 函式把片段檔載進範本。它的語意等同於 PHP 的 require(),也就是把另一個檔案的內容直接拉進當前位置執行。
WordPress 以積木方式把主題拆成片段:header.php 掌管 <body> 之前的 HTML 與開頭、footer.php 掌管頁尾到 </body>、</html> 結束,常見的客製化勾點 wp_head 與 wp_footer 就分別作用在這兩個檔案裡。頁面主要內容則先依範本階級(template hierarchy)讀到對應的範本檔,再在範本檔內用 get_template_part() 載入更細的片段。
函式有兩個主要參數,第一個是路徑加檔名前綴(必填,不含 .php),第二個是代稱(選填):
get_template_part( 'nav' )載入nav.phpget_template_part( 'nav', 'single' )載入nav-single.phpget_template_part( 'template-parts/content', get_post_type() )載入template-parts/資料夾中的content-{內容類型}.php
最後一種寫法是官方主題的常見手法,get_post_type() 會回傳當前內容類型,於是同一行程式碼就能依文章、頁面、自訂內容類型自動切換到對應的內容片段。從 WordPress 5.5 起,函式還支援第三個 array() 參數把資料傳進片段檔,讓片段能依傳入值動態變化,不必再靠全域變數硬接。
實際應用不只用來載入主內容,也能把頁面中段的區段切出來重用。以企業形象網站為例,可以把服務介紹這種區段存成 template-parts/section 底下的片段,需要時呼叫,達到和區塊主題樣板組件一樣的「改一處、處處更新」效果,只是這裡的「更新」發生在程式碼層級而非後台。
有一個容易踩的雷:get_template_part() 的回傳值不能存成變數。因為它的行為等同 require(),是直接輸出而非回傳字串,所以像是想把片段內容塞進 wp_nav_menu() 的 items_wrap 參數這類操作會失敗。需要拿到輸出字串時得改用輸出緩衝(output buffering)把內容接起來。
樣板組件、同步圖樣與一般圖樣,三者該怎麼選
這三者都能重用,但用途分得很清楚,選錯會讓網站結構變亂。先看官方的定位對照:
| 類型 | 性質 | 同步行為 | 典型例子 |
|---|---|---|---|
| 樣板組件(Template Part) | 網站結構 | 永遠同步 | 頁尾 |
| 同步圖樣(Synced Pattern) | 使用者內容 | 同步 | 營業時間 |
| 一般圖樣(Pattern) | 使用者內容 | 不同步 | 行動呼籲區塊 |
判斷的第一條軸線是「這東西算結構還是內容」。樣板組件代表網站結構,不該是文章或頁面的一部分,頁首、頁尾就屬於這類,它在區塊主題裡帶有語意(semantic)意義,因此要刻意區分。同步圖樣與一般圖樣則屬於使用者內容,像營業時間、行動呼籲這種會出現在內文裡的東西。
第二條軸線是「要不要同步」。樣板組件和同步圖樣都是改一處、用到的地方全更新;一般圖樣則是插進頁面後就脫離母體,當下那頁怎麼改都不會影響其他頁面的同一個圖樣,適合那種「版面要一致、但每處內容各自填」的情境,例如同一個見證區塊樣式,但每頁放不同客戶的話。
實務上的選法可以這樣抓:頁首頁尾這種跨全站重複的結構用樣板組件;營業時間、聯絡方式這種會重複出現在內文、且要一改全改的零碎內容用同步圖樣;只是想快速套一個漂亮版面、內容各頁自訂的用一般圖樣。
組合上有個規則要記住:樣板組件不該被放進同步圖樣或一般圖樣裡,因為它代表的是結構而非內容;反過來,樣板組件裡面可以包含同步圖樣,也可以用一般圖樣當積木去拼。簡單講,圖樣可以拿來蓋樣板組件,但別把樣板組件塞進圖樣。
樣板組件在 WooCommerce 商店頁面的角色
如果你經營的是 WooCommerce 商店並使用區塊主題,樣板組件同樣是維護商店外觀的核心工具。商店頁、單一商品頁、購物車、結帳這些頁面的整體骨架由樣板(如商店、商品分類等樣板)決定,而頁首、頁尾這類跨頁共用的區段,依舊是透過樣板組件統一管理。
這帶來的好處很直接:商店頁與部落格文章頁可以共用同一個頁首樣板組件,改一次導覽選單,購物動線與內容頁就同步更新,不必擔心商店區和文章區的頁首長得不一樣。商品頁中重複出現的版面元素(例如商品卡片的排列樣式)則更適合用圖樣來處理,因為那比較偏向「設計重複」而非「全站結構」。
收款相關的設定(金流串接、付款方式啟用)屬於 WooCommerce 後台的獨立功能,不在樣板組件的管轄範圍內,這裡只需要知道:結帳頁的「外框」(頁首頁尾)由樣板組件管,結帳的「功能」由 WooCommerce 區塊與設定管,兩者分屬不同層。
使用樣板組件常見的踩雷與效能疑慮
最常見的誤會是擔心 get_template_part() 用多了拖慢網站。實際上它對效能的影響有限。它底層用 locate_template() 偵測片段檔是否存在,而 locate_template() 透過 foreach() 搭配 file_exists() 依順位尋找檔案;file_exists() 的結果會被 PHP 自動快取,所以即使同一個片段重複載入,負擔也不大。除非 template-parts/ 裡的片段檔數量極多、又在單一頁面裡海量呼叫,否則一般情境下不必為效能焦慮,模組化帶來的維護便利遠大於這點成本。
區塊主題這邊則有另一組常見問題。第一是「編輯原始檔」誤觸:在範本裡點進樣板組件編輯時,沒注意到自己改的是會全站同步的本體,一存檔就動到所有頁面,動手前務必確認編輯範圍。第二是把不該同步的內容做成樣板組件,導致每頁都被迫顯示同一份內容,結果又回頭一頁頁拆,這時候其實該用一般圖樣。第三是主題切換的落差:從傳統主題換到區塊主題後,原本寫在 .php 片段裡的客製化不會自動搬進 parts/ 的 .html 樣板組件,兩套機制不相通,需要重新在站台編輯器裡建置。
還有一個跨主題類型都會遇到的判斷題:什麼時候該把一段版面抽成樣板組件。原則是看「重複次數」與「是否要連動更新」。只在一兩個地方出現、又各自獨立的版面,抽成樣板組件反而增加管理層級;真正跨多個範本重複、且要一改全改的結構,才值得抽出來。過度模組化和完全不模組化一樣會增加維護負擔。
判斷自己該往哪條路走,其實只要先回答一個問題:你的主題在「外觀」選單下有沒有「編輯器」。有,就把頁首頁尾交給站台編輯器的樣板組件,全程不寫程式;沒有,就回到 get_template_part(),把重複片段收進 template-parts/ 資料夾用 PHP 載入。先認清自己站在哪個世界,再決定用滑鼠還是用程式碼,重用與維護的麻煩就解掉一大半。把今天手上專案的頁首、頁尾先抽出來重用一次,是體會樣板組件價值最快的方法。