Wordpress

WordPress 外掛太多會不會變慢?先看 3 個關鍵

一個裝滿螺絲起子、扳手、捲尺的工具箱,決定它好不好用的從來不是抽屜裡躺著幾把工具,而是每一把擺的位置對不對、能不能順手拿出來用。亂塞三十件工具的抽屜,常常比整齊收著十件工具的箱子更難找到需要的那一支。這也是為什麼「WordPress 外掛太多會不會變慢」這個疑慮,幾乎每個經營網站的人遲早都會問一次。

多數人的直覺是外掛數量越少越好,裝到二十個、三十個就該緊張。但這個直覺忽略了兩個更關鍵的變數:外掛本身的程式碼寫得好不好,以及它是不是每一頁都在載入用不到的資源。裝十個寫得精簡的外掛,速度反而可能贏過只裝三個效能很差的外掛,數量從來不是唯一的答案。搞懂這兩個變數,你才能判斷哪些外掛該留、哪些該砍,而不是看到後台跳出一長串外掛清單就自動緊張。

先從 WordPress 怎麼在每一次讀取網站時把外掛跑過一遍講起,再一項一項拆開真正會拖慢速度的地方。

外掛裝越多,網站就一定越慢嗎?

每次有人打開你的網站,WordPress 都要重新跑一次完整的請求流程:讀取資料庫、載入佈景主題,再把所有啟用中外掛的程式碼跑過一輪,最後才把頁面組好回傳給瀏覽器。這代表外掛數量確實是速度的其中一個變數,裝得越多,原則上要被執行的程式碼量也越多。

WordPress 官方的效能最佳化說明也把外掛數量列為重要因素,提到外掛的數量與各自的效能表現都會影響整體速度,並建議停用、刪除用不到的外掛是提升效能的明顯做法之一。只是這句話容易被斷章取義成外掛越少越快,忽略了後半句效能表現其實才是真正拉開差距的變數。十個外掛裡有九個寫得精簡,對速度幾乎沒有感覺;剩下那一個如果查詢效率很差,單獨一個就能讓整頁慢下來。

外掛數量不等於網站速度,10 個精簡外掛可能比 3 個效能差的外掛更快
外掛變慢不是因為裝得多,而是每一支的程式碼品質與載入方式。

所以比起數手上裝了幾個外掛,更準確的提問應該是這幾個外掛各自在每次請求裡,做了哪些會拖慢頁面的事。後面拆成三個具體會拖慢速度的地方,一項一項對照著看。

真正決定外掛快慢的,是這三個地方

外掛數量只是一個統計數字,底下真正影響效能的是三個更具體的面向:外掛本身的程式碼寫得好不好、它是不是每一頁都在載入用不到的資源,以及它在資料庫層留下多少負擔。下次評估一個外掛該不該裝,與其數手上有幾個,不如照著這三點逐一檢查。

真正決定外掛快慢的三個地方:程式碼品質、每頁載入用不到的資源、資料庫 Autoload 負擔
評估一個外掛該不該裝,看這三點:程式碼品質、是否每頁都載入用不到的資源,以及資料庫 Autoload 負擔。

程式碼品質:效率好壞決定資源消耗

外掛終究是一段程式碼,寫得好或寫得差,對效能的影響天差地遠。WordPress 官方外掛開發手冊在講最佳實踐時,要求開發者把所有全域可存取的函式、類別與變數都加上獨一無二的前綴,避免跟 WordPress 核心或其他外掛的命名互相衝突;也建議用物件導向的寫法把程式碼包進自己的類別,並把後台專用的程式碼跟前台程式碼分開執行,不需要的場合就不要載入。這些規則表面上是為了避免衝突與維護方便,實際上也決定了一個外掛會不會在你不需要它的地方,多跑一堆用不到的程式碼。

跟這條原則相關的還有資料庫查詢的效率。WordPress 官方的效能最佳化說明也提到,資料庫層的調校,像是善用查詢快取,會明顯影響外掛的整體效能表現。寫得好的外掛會盡量重複利用 WordPress 已經準備好的查詢工具,而不是自己另外寫一套效率沒被驗證過的查詢邏輯。與其糾結手上裝了幾個外掛,不如先看這幾支外掛的開發者,有沒有把這些基本功做到位。

這個外掛,是不是每一頁都在載入用不到的資源?

不少外掛不分頁面情境,一律在網站每一頁都載入自己的 CSS 與 JavaScript,即使那個功能只有在特定頁面才用得到。最常見的例子是聯絡表單外掛:它的樣式與腳本其實只有聯絡頁面需要,卻常常被同時載入到首頁、文章頁甚至購物車頁面,讓每個訪客都多下載一份用不到的檔案。

國際主機服務商 SupportHost 做過一次實測,安裝 Contact Form 7 這款聯絡表單外掛後,同一個頁面的請求數從 10 個增加到 14 個,頁面大小也從 272 KB 增加到 313 KB,增加的部分幾乎都是這個表單外掛自己帶進來的檔案。這種不分場合都上工的載入方式,比外掛數量本身更直接影響頁面大小與請求數。下次評估一個外掛,不妨自問這一頁是否真的需要它現在載入的這些資源。

資料庫查詢與 Autoload:外掛怎麼拖慢後台速度

很多外掛會把自己的設定值存進 WordPress 的 wp_options 資料表裡,而且預設標記成 autoload,代表每一次網站被讀取,不管前台後台,WordPress 都會把這些資料整批撈出來,不管當下用不用得到。外掛裝得越多,又沒有妥善清理,這批每次都要讀的資料就會越滾越大,連帶拖慢整個網站,不只是後台。

WordPress 官方的效能最佳化說明對這件事給了一個具體的參考值,建議網站的 autoload 選項資料一般控制在 800 KB 以下。超過這個門檻,資料庫在處理每一次請求時都要多花力氣,速度自然被拖慢。這也解釋了一個常見現象,為什麼砍掉某個外掛之後,網站變快的幅度往往比想像中明顯,因為砍掉的不只是那支外掛本身的程式碼,還包括它長年累積在 autoload 裡的殘留設定。

外掛種類不同,實測拖慢的幅度差異懸殊

外掛對速度的影響,類型之間的落差遠比外掛數量本身的落差要大。兩份國際實測資料都指向同一個結論,安全性與電商類外掛的衝擊明顯偏高,備份與聯絡表單類外掛則幾乎感覺不到差異。

WordPress 佈景主題與外掛開發商 Themeisle 做過一次測試,基準頁面(未裝任何外掛)的載入時間是 0.93 秒,裝上不同外掛後的變化如下:

外掛類型載入時間增加幅度
Wordfence安全性1.13 秒增加 21.5%
UpdraftPlus備份0.94 秒增加 1.07%
Contact Form 7聯絡表單0.96 秒增加 3.22%
Yoast SEOSEO1.03 秒增加 10.75%
WooCommerce電商1.22 秒增加 31.10%

五款外掛同時啟用時,平均載入時間是 1.20 秒,只比基準值多了大約 29%。

SupportHost 另外用 GTmetrix 做過同類型的測試,基準頁面(未裝任何外掛)是 0.7 秒,結果如下:

外掛類型載入時間增加幅度
Wordfence安全性0.9 秒增加 29%
UpdraftPlus備份0.7 秒增加 0%
Contact Form 7聯絡表單0.8 秒增加 14%
Yoast SEOSEO0.8 秒增加 14%
WooCommerce電商0.9 秒增加 29%

五款外掛同時啟用時,載入時間來到 1 秒,比基準值多了 43%。

這兩份測試分別在不同的主機環境與年份完成,數字本身不能直接互相比較,也不必當成精確的效能保證,拿來定性佐證一件事已經足夠,那就是類型的差異遠大於數量的差異。兩份測試還都指向另一個現象——把五款外掛加總的個別增幅相加,Themeisle 那組加起來將近 68%,SupportHost 那組加起來是 86%,但實際五款同時啟用時,增幅只有 29% 與 43%。外掛之間彼此拖慢的效果不是線性疊加,裝第五個外掛造成的邊際影響,通常比裝第一個外掛小得多。

安全性與電商類外掛的載入時間增加幅度最大,備份類幾乎為零,類型差異遠大於數量
安全性與電商類外掛的衝擊最大,備份類幾乎沒有差異(資料來源:Themeisle、SupportHost 實測)。

怎麼揪出真正拖慢你網站的外掛?

知道類型比數量更關鍵之後,下一個問題是怎麼具體揪出你自己網站上的兇手。與其一個一個關掉外掛用猜的,不如照著三個步驟由淺入深:先建立一個基準值、再用工具看數據縮小範圍,最後用官方內建的方式逐一驗證。走完這三步,通常就能明確指出真正拖慢速度的那一個。

第一步:先抓出目前的速度基準值

動手找兇手之前,要先知道你的網站現在有多慢。用效能分析工具(例如 Google 的 PageSpeed Insights)測一次目前的網站狀態,記下載入時間、請求數這類關鍵數字,當作之後每一次測試的對照組。沒有這個基準值,之後停用外掛測出來的差異就無從比較起。

Google 官方的 PageSpeed Insights 說明文件把呈現的數據分成兩種:Lab data(實驗室數據)是在控制過的環境下模擬出來的結果,適合抓問題、除錯;Field data(欄位數據)則來自真實使用者在不同裝置、不同網路環境下的實際體驗,反映的是網站在現實世界裡的樣子。兩種數據抓基準值都有用,但意義不同,測完記得分開看,不要把兩組數字混在一起比較。

第二步:用 Query Monitor 抓出耗資源的外掛

有了基準值,接下來可以安裝 WordPress.org 官方免費外掛 Query Monitor。裝好之後,後台工具列會直接顯示目前這一頁執行了幾次資料庫查詢、各花了多少時間,而且會依外掛、佈景主題或個別函式分類彙總,不用自己一行一行去猜是哪支外掛在拖時間。哪個外掛的查詢次數特別多、花的時間特別長,一眼就能看出來,不必再憑感覺懷疑。

Query Monitor 依外掛分類彙總資料庫查詢,查詢次數與花費時間最高的外掛就是拖慢網站的兇手
Query Monitor 會依外掛彙總查詢次數與花費時間,讓最耗資源的那一支一眼現形(面板示意)。

第三步:用官方疑難排解模式逐一停用測試

Query Monitor 縮小範圍之後,最後一步是實際驗證。根據 WordPress 官方的說明,安裝 WordPress.org 官方外掛「Health Check & Troubleshooting」後就能開啟疑難排解模式,啟用之後只有你自己登入的帳號會看到所有外掛暫時停用、換回預設佈景主題的畫面,其他訪客瀏覽網站完全不受影響,看到的還是原本正常運作的版本。接下來把外掛一個一個重新啟用,每啟用一個就照第一步的方式測一次速度並記錄下來,速度明顯掉下去的那一次,重新啟用的外掛就是兇手。

停用外掛與更新頻率,也會影響網站表現

抓出兇手、處理掉它之後,還有兩個讀者常會遇到的相關疑問,直接併進這裡一起談,不必另外開一個問答區塊。

停用但沒刪除的外掛,還會拖累網站嗎?

外掛一旦停用,前端就不會再執行任何功能,也不會被載入到頁面上,這部分可以放心。但停用不等於乾淨,它先前寫進 wp_options 資料表裡的設定值,如果沒有一併清掉,很可能還留在 autoload 裡佔著空間,持續拖慢每一次請求,即使這支外掛早就沒在運作。與其把外掛先停用觀察一陣子,不如確定不用之後就直接刪除乾淨,才不會讓這些殘留資料悄悄疊加,推著 autoload 資料量往前面提到的 800 KB 門檻靠近。

外掛數量越多,維護與更新的心力也要跟著增加

就算每一個外掛對速度的衝擊都很輕微,裝的數量一多,真正變重的其實是維運這件事。每個外掛都有自己的更新頻率,版本一多,要盯的更新通知、要留意的相容性問題也跟著變多,一次系統或佈景主題升級,踩到某支外掛沒跟上腳步而出狀況的機率也隨之提高。這也是為什麼 WordPress 官方的效能最佳化說明會建議把用不到的外掛直接停用並刪除,外掛數量對速度來說多半只是個間接因素,對維護心力而言,卻是實實在在的負擔,這才是真正該拿來決定要不要精簡的理由。

WordPress 後台已安裝外掛清單,每支外掛都有版本與自動更新設定,數量一多要盯的更新也變多
後台的已安裝外掛清單,外掛一多,要盯的版本更新與相容性也跟著變多。

回到最前面那個工具箱,抽屜裡放了幾把工具從來不是重點,每一把擺得對不對、用不用得上才是關鍵。WordPress 外掛也是同一個道理,與其糾結後台顯示裝了幾個外掛,不如花時間確認每一支外掛的程式碼品質好不好、資源有沒有被浪費在用不到的頁面上,以及資料庫裡有沒有留下不必要的殘留設定。

下次再擔心網站變慢,別急著把外掛一個個砍光。先測一次基準值,裝上 Query Monitor 看數據,再用官方疑難排解模式逐一驗證,親自確認問題出在哪一支外掛,而不是哪一個數字。找到真正的兇手,才是讓網站穩定變快的做法。

資料來源
  1. Optimization – Advanced Administration Handbook — WordPress
  2. Best Practices – Plugin Handbook — WordPress
  3. Do plugins slow down WordPress? — SupportHost
  4. Do Plugins Affect WordPress Performance? Real Test Data — Themeisle
  5. About PageSpeed Insights — Google
  6. Query Monitor – WordPress plugin — Query Monitor
  7. Health Check & Troubleshooting – WordPress plugin — Health Check & Troubleshooting