View Categories

客製碼放子主題還是 Code Snippets?

< 1 分鐘閱讀

快速答案:兩者都不會被更新蓋掉;會被蓋掉的是直接寫進「母主題」functions.php 或外掛檔案裡的程式碼。差別在綁在哪裡:子主題的 functions.php 綁佈景,換佈景就失效,寫錯一個字整站出現嚴重錯誤;Code Snippets 綁那支外掛,可以一段段開關、寫錯會自動停用,但外掛一被停用,所有片段會一起靜靜失效。

為什麼會這樣 #

佈景或外掛更新時,WordPress 是把整個資料夾換成新版,寫在裡面的修改一定消失。子主題是另一個資料夾,母主題更新碰不到它;Code Snippets 把程式碼存在資料庫,外掛本身更新也不影響片段內容。

兩者還有一個常被忽略的差別:執行時間點。片段外掛的程式通常在外掛載入階段就執行,子主題的 functions.php 要等所有外掛都載入後才輪到。用來「移除某支外掛預設行為」的程式碼,如果比那支外掛還早執行,就等於沒寫——外掛廠商的範例碼常註明要放 functions.php,原因就在這裡。

怎麼處理 #

怎麼選 #

  • 跟佈景有關的(版型、頁首頁尾輸出、佈景專屬的掛勾):放子主題。
  • 跟佈景無關的網站功能(結帳欄位、發票或物流的修補、寄信調整):放 Code Snippets,或做成一支自己的小外掛,將來換佈景不用搬。
  • 絕對不能停的關鍵功能:放 wp-content/mu-plugins,它會自動載入、後台無法停用。

不管放哪都要做的事 #

  1. 留一份清單:每段程式碼放在哪、做什麼、誰要求的、哪天加的。
  2. 修改前先備份。片段寫壞進不了後台時,可在 wp-config.php 加上 CODE_SNIPPETS_SAFE_MODE 常數暫停全部片段,救回後再逐段檢查。
  3. 換佈景、停用外掛、降級方案前,先對清單看會牽動哪些程式碼。
  4. 升 PHP 版本時把這些自訂碼一起納入測試,舊寫法最容易在新版 PHP 出錯(見升級 PHP 8 前的檢查)。
  5. 資安檢查別漏了片段清單:片段外掛能執行任意程式碼,拿到管理員權限的攻擊者也會把惡意程式塞在這裡。我們做資安掃描時,片段清單跟外掛目錄、uploads 是一起查的。

我們實際遇過的情況 #

一家電商某天建立物流出貨單時突然報錯,查下來是一段修補中文欄位的程式碼片段被停用了。前台看不出異狀,問題直到出貨才浮現(出貨單的其他排查見超商物流單產生不了)。這也是清單的用處:知道有這段程式碼存在,才會想到去查它。

另一個有出價競標功能的商店,外掛廠商給了一段調整「出價後直接購買按鈕」的程式碼,放進 Code Snippets 怎麼試都沒作用;廠商的答覆是這段要放在子主題的 functions.php,不能放片段外掛——這類限制,多半就出在上面說的執行時間點。

什麼時候該找人 #

改完片段或 functions.php 後整站嚴重錯誤、後台進不去,要從主機端改檔救回(見白畫面的排查順序);或是接手的網站沒人說得清哪裡藏了哪些自訂碼,升級前需要有人逐一盤點,再決定各自該搬到哪裡。

常見問題 #

佈景主題更新會蓋掉 functions.php 裡的程式碼嗎? #

改在母主題 functions.php 的會被蓋掉;放在子主題 functions.php 或 Code Snippets 的不會。

為什麼廠商給的程式碼放 Code Snippets 沒作用? #

片段外掛較早執行,要移除外掛預設行為的程式碼可能跑在外掛之前而失效,改放子主題 functions.php 即可。

Code Snippets 寫壞了進不了後台怎麼辦? #

在 wp-config.php 加上 CODE_SNIPPETS_SAFE_MODE 常數暫停所有片段,救回後台再修正那一段。

想有人幫你盤點與管理這些自訂程式碼:網站守護方案。改壞了進不去後台:網站救援當日受理