一名工程師花了好幾個小時,替客戶的網站調整版面、加上幾個客製化功能,交件時客戶滿意,工程師自己也覺得成品順眼。幾個月後,佈景主題推送一次例行的安全性更新,網站站長隨手按下更新鍵,重新整理頁面一看,那些花時間調過的版面與功能全部消失,網站瞬間變回廠牌預設的樣子。
這類事故在 WordPress 維運圈並不少見,而且多半不是更新過程出了什麼技術差錯,問題出在打從一開始,客製化的方式就選錯了。WordPress 子佈景主題(Child Theme)正是用來避免這種狀況的機制,讓客製化的程式碼獨立存放在自己的資料夾裡,不管父佈景主題之後更新幾次,客製化的內容都不會被覆蓋,也不會被清空。
先從「直接改佈景主題檔案」為什麼注定會出事講起,再一路拆解子佈景主題實際上怎麼運作、什麼情況下還用得到,又有哪些地方它其實幫不上忙。
改了佈景主題的檔案,為什麼一更新就不見?
沒有子佈景主題觀念的人,客製化網站時很自然會直接打開佈景主題資料夾裡的 style.css、functions.php,或某個模板檔案下去改。這麼做的當下確實有效,網站也達到想要的樣子,問題出在下一次更新。
WordPress 佈景主題更新的機制,是把整個佈景主題資料夾裡的檔案整批替換成新版本,而不是逐行比對、保留你動過的地方再合併進去。WordPress 官方的開發者文件就直接點出這個結果,如果把自訂的函式寫進佈景主題的 functions.php,下一次佈景主題更新,這個函式就會消失。Learn WordPress 官方學習課程也用同一套邏輯解釋這件事,更新時整個佈景主題會被替換成新版本,所以你對任何檔案做的修改都會遺失。換句話說,不是這次更新特別粗暴,而是「直接改檔案」這個做法,從一開始就跟佈景主題更新的運作方式互相衝突。
那乾脆都不要更新,是不是就能避開這個問題?答案是不行。佈景主題廠商持續推送更新,通常是為了修補資安漏洞、跟上新版 WordPress 的相容性,或加入新功能;長期不更新的佈景主題,等於把網站暴露在已知的資安風險裡,也可能哪天跟新版 WordPress 兜不起來,導致網站故障或版面跑掉。真正該解決的不是「要不要更新」,而是「客製化該寫在哪裡」。
WordPress 子佈景主題是什麼?
子佈景主題(Child Theme)就是那個解方,一個依附在「父佈景主題」(Parent Theme)之上的獨立佈景主題外殼,它會自動繼承父主題全部的外觀與功能,但客製化的程式碼另外獨立存放在自己的資料夾裡,跟父主題檔案完全分開;WordPress 開發者文件對子佈景主題的定義也是同一個邏輯,子佈景主題就是父佈景主題的擴充版本。
可以把它想成疊在一幅原畫上的一層透明片。你在透明片上加的線條、改的顏色都清楚可見,但底下那張原畫本身完全沒被動到;透明片隨時可以整片撕下來,畫作依然保持原樣。子佈景主題的運作方式也是如此,客製化的部分寫在子主題這一層,父主題那張「原畫」永遠維持出廠時的狀態,可以隨時更新,也可以隨時把子主題拿掉還原。
技術上,WordPress 怎麼判斷誰是誰的子主題?靠的是子主題 style.css 檔頭裡的 Template 欄位——這個欄位必須寫成跟父主題資料夾名稱完全一致的字串,WordPress 才會知道這個子主題該去繼承哪一個父主題。也因為這層依附關係,子佈景主題沒辦法單獨運作,父主題必須留在網站上並保持安裝的狀態(即使不啟用它),一旦父主題被移除,子主題就會跟著失去依附的對象,直接失效。

子佈景主題繼承父主題的哪些部分?
樣式、版型、佈景主題原有的功能,預設都會整套繼承自父主題;子佈景主題只要放進一個跟父主題同名的檔案(例如某個模板檔),WordPress 就會優先讀取子主題那一份,蓋掉父主題對應的版本。
functions.php 是唯一的例外。子主題的 functions.php 不是拿來覆蓋父主題的 functions.php,而是兩份檔案都會被載入,子主題先載入,父主題緊接著載入。新手在這裡最常踩到一個地雷,就是把父主題整份 functions.php 複製貼到子主題裡。這樣一來,兩邊會出現同名的函式,WordPress 沒辦法判斷該執行哪一個,網站會直接跳出嚴重錯誤(fatal error)而打不開。正確做法是,子主題的 functions.php 只寫「新增或修改」的部分,不要整份複製父主題的內容。

子佈景主題靠檔案分開存放,擋住更新覆蓋
搞懂子主題怎麼繼承父主題、functions.php 又怎麼疊加載入之後,可以回頭看最開頭那個更新後心血全部消失的處境,子佈景主題實際上怎麼避免同一件事重演?邏輯很直接,客製化的程式碼、樣式全部寫進子主題自己的資料夾,佈景主題推送更新時,WordPress 只會替換「父主題」資料夾裡的檔案,子主題資料夾完全不會被碰到。
只要一開始就把客製化寫進子佈景主題,父主題不管更新幾次,子主題裡的東西都會原封不動留著。如果開頭那位工程師一開始用的是子佈景主題,面對同一次安全性更新,結果會完全不同,客戶的客製化調整不會消失,工程師也不用重做一次。

子佈景主題帶來的好處不只是「不怕更新」。WordPress 開發者文件把它的效益整理得很具體:客製化的內容可以整包搬到別的專案繼續用,也就是可攜帶、可複製;客製化跟父主題的程式碼清楚分開,好維護也好交接;父主題可以放心接受更新,不用擔心哪天心血被清空;而且因為只需要寫「新增或修改」的部分,不必重寫整個佈景主題,開發時間也比較短。
使用區塊主題,還需要子佈景主題嗎?
WordPress 全站編輯(Full Site Editing)與區塊主題(Block Theme)普及之後,子佈景主題的角色出現了新的變化,值得單獨拆開來講,免得整篇文章只停留在舊版古典佈景主題(PHP 模板)的年代。
以前很多非得改檔案才能做的調整,像是版面結構、頁尾排版、色票、字體,現在可以直接在「網站編輯器」(Site Editor)介面裡完成。這些改動存進的是資料庫,不是佈景主題檔案本身,所以佈景主題更新並不會清掉這些設定,等於多了一層不用寫程式碼、也不怕被更新洗掉的保護。WordPress 開發者文件描述這個階層時,把使用者在編輯器裡做的客製化,形容成排在「父主題、子主題」之後的第三層,因為這些改動存在資料庫,而不是檔案系統裡。
不過這不代表子佈景主題從此用不到。只要客製化牽涉到直接修改 theme.json、HTML 範本檔、CSS、PHP 或 JavaScript 這幾種檔案層級的東西,還是得靠子佈景主題保護,因為這些檔案本身不受網站編輯器保護。區塊主題跟子佈景主題彼此相容,子主題還可以用來覆蓋父主題的 theme.json,把色票、字體鎖定住,不被父主題之後的更新動到。判斷準則其實很單純,只在介面裡點一點、存進資料庫的改動,通常不需要子主題;只要動到檔案本身,就需要。
子佈景主題保護不了大幅度改版
不管是古典佈景主題還是區塊主題,子佈景主題能處理的規模都有一個上限。它不是萬能保護傘,設計來處理的是中小規模的客製化,像是調整顏色、修改版面細節、加幾個自訂功能。如果需求已經大到等於要整個重做版面結構,還要加上一大堆父主題完全沒有的全新功能,硬要把這些通通塞進子主題,只會讓專案越改越亂,維護起來也越來越吃力。
碰到這種規模的專案,更務實的做法是把父主題整份複製(fork)出來,當成自己完整的佈景主題重新開發,而不是無止境地往子主題裡塞檔案。WordPress 開發者文件也提醒,從子佈景主題內部做太大量的客製化,終究會變成管理上的一大麻煩,遇到這類大型專案,直接複製原始佈景主題、打造一個完整的父主題,通常才是比較好的做法。
另外,一開始選錯父主題,功能太陽春、跟實際需求差太遠,才是最容易讓子佈景主題失控的常見源頭。挑一個貼近需求的父主題,能省下後續大量的客製化工夫。
沒有子佈景主題,怎麼取得或建立一個?
選對父主題只是第一步,實際上要怎麼幫網站準備好一個子佈景主題?這裡只給方向,不展開成逐步操作教學。
多數市面上正式販售的付費佈景主題,本身就會附一份現成的子佈景主題壓縮檔。安裝主題的時候,記得連子主題一起安裝並啟用,不用自己動手寫程式碼。
如果選的佈景主題沒附子主題,手動建立的技術門檻其實很低,只需要在 wp-content/themes 底下開一個新資料夾,放一個帶 Template 欄位的 style.css 檔案,就能被 WordPress 辨識成子主題;但要讓它的樣式真正生效,還需要對應的載入設定才行。
近年在區塊主題環境下,WordPress 也推出了免寫程式碼的做法,官方外掛 Create Block Theme 讓你在網站編輯器裡先把想要的樣式、範本都調整好,再直接點選建立子主題的按鈕,就會把目前的改動打包成一個子佈景主題,不用自己手刻任何檔案。這節只給選擇方向與心法,實際操作步驟留給你依需求另外查證。
WordPress 子佈景主題不是進階工程師才需要懂的冷知識,而是任何打算長期維護、客製化 WordPress 網站的人,動手改東西之前就該先養成的習慣。
下次想調整佈景主題的外觀或功能,不妨先問問自己這個改動打算寫在哪裡。如果答案是「直接改父主題的檔案」,那就先停下來,改寫進子佈景主題,這樣下一次更新按下去,辛苦調出來的客製化才不會像開頭那位工程師一樣,一次歸零。
