WordPress 越跑越慢?解鎖 Headless 架構:讓 CMS 專注內容,CRM 掌管大數據的完美分工
☰ 目錄 table-of-contents.md
WordPress 越跑越慢,多半不是主機問題,而是架構「肥胖」
WordPress 的本質是內容管理系統,不是會員資料庫,更不是行銷數據中台。購物車、會員、追蹤外掛一路裝上去,後台越來越卡,升級主機也只是暫時止痛——病灶在架構本身。我的解法是讓 WordPress 專心當 CMS、讓 CRM 掌管會員與訂單數據,前端透過 API 取資料,這套分工就是 Headless 商務架構。
本文用實戰角度告訴你:Headless 到底拆掉什麼、為什麼能變快、會員驗證與 SEO 怎麼處理,以及最重要的——你的網站到底該不該做 Headless。先講重點:純部落格或小型形象站不需要 Headless,做好快取就夠;但若你有龐大會員資料、需要與 POS/ERP 整合、或要支援多通路,Headless 才是值得的投資。
最近又有客戶跑來跟我抱怨:「Eric,我們的官網加上購物車,再裝了幾個行銷追蹤外掛後,後台慢得像樹懶,前台載入也要三秒鐘,是不是該換主機了?」
這是一個經典的工程師與業主的對話場景。很多時候,問題不在主機(雖然升級主機通常能暫時止痛),而是在於架構本身的「肥胖」。我們習慣把 WordPress 當成萬能瑞士刀:要寫文章用它、要賣東西用 WooCommerce、要管會員用 wp_users、要發電子報又裝個外掛。結果資料庫裡的 wp_options 和 wp_postmeta 腫得像麵龜,查詢效能自然直線下降。
在追求極致效能與數據整合的情境下,答案往往不是「再多加一層快取」,而是徹底的架構重組——打造 Headless 商務架構:WordPress + CRM。今天我們就來聊聊,如何把大腦(數據)和臉(內容展示)分開,讓網站飛起來。
什麼是 Headless WordPress?為什麼要加上 CRM?
傳統的 WordPress 是「單體式架構」(Monolithic),後端(PHP / MySQL)和前端(HTML / Theme)緊緊綁在一起。你發布一篇文章,WordPress 直接在伺服器端把資料、模板、外掛邏輯全部組合成渲染好的 HTML 頁面,再回傳給瀏覽器。這意味著「展示」和「資料處理」共用同一套運算資源、同一個資料庫,任何一邊變重都會拖累另一邊。
而 Headless WordPress 則是把「頭」(前端展示層)砍掉(別怕,是分離開來),只保留 WordPress 強大的內容管理後台。前端改用 React、Vue 或 Next.js 等現代化框架,透過 REST API 或 GraphQL 來跟 WordPress 要資料。簡單說:WordPress 從「網站」降格成「資料供應商」。
那 CRM 的角色是什麼?
這就是關鍵所在。在 Headless 商務架構中,我們不再把「會員資料」或「訂單行為」全部塞進 WordPress 的 MySQL 資料庫。相反的,我們讓專門的 CRM(如 Salesforce、HubSpot,或客製化 CRM)來處理這些高價值的客戶數據。
用一句話分工:CMS 管「內容」,CRM 管「客戶」,前端管「體驗」。下表可以幫你快速對照三者各自負責什麼:
| 角色 | 系統 | 負責什麼 |
|---|---|---|
| 內容大腦 | WordPress (CMS) | 文章、靜態內容、媒體庫、SEO Meta 資料 |
| 展示層(Head) | Frontend 框架 | 極速渲染、使用者互動體驗、跨裝置呈現 |
| 數據大腦 | CRM | 會員登入驗證、交易紀錄、行銷自動化標籤 |
Headless 架構的三大技術優勢
1. 效能與安全性隔離
當你的網站流量暴衝(例如大型促銷活動)時,傳統架構下大量的資料庫寫入(訂單、Log)會卡死讀取(文章頁面),因為讀寫共用同一個資料庫與同一台應用伺服器。在 Headless 架構下,前端可以是部署在 CDN 邊緣節點上的靜態生成頁面(SSG,Static Site Generation),讀取速度是毫秒級的回應;而後端的 CRM 即使在處理複雜交易邏輯,也不會拖累官網的瀏覽體驗。
安全性也跟著受益:對外公開的只剩前端與唯讀的內容 API,真正敏感的會員與交易資料藏在獨立的 CRM 後端,攻擊面(attack surface)大幅縮小。
2. 真正的多通路內容分發(Omnichannel)
你的 WordPress 內容不再只是給網頁看。透過 API,同一份產品介紹可以同時推送到 App、小程序、甚至是店內的 Kiosk 機台。這就是「API First」的思維——內容生產一次,到處消費,而不是每個通路各自維護一份內容。
3. 開發者的快樂(與痛苦)
老實說,寫 PHP 的 Blade 模板有時候真的讓人想睡覺。轉向 Headless 後,前端工程師可以用他們最愛的 React component 來開發,前後端職責分明、可以平行作業,體驗更好。但相對的,我們需要處理更多的 API 串接邏輯、跨網域(CORS)設定與部署管線——天下沒有白吃的午餐,這份自由是用「多一層工程複雜度」換來的。
實戰:如何讓 WordPress 變成稱職的 API Server
WordPress 內建的 REST API 已經很強大,但通常我們會需要「客製化」端點,因為預設的 API 吐出的資料常常包含太多用不到的欄位(一堆渲染相關的雜訊),或者缺少我們需要的關鍵欄位(例如自訂欄位的資料)。為前端量身打造一個精簡端點,可以減少傳輸量、降低前端解析成本。
身為工程師,這裡我分享一段簡單的程式碼,教你如何註冊一個輕量化的 API 端點,專門吐出給前端用的精簡文章資料:
// 在 functions.php 或自製外掛中加入
add_action('rest_api_init', function () {
register_rest_route('roamer/v1', '/featured-posts', array(
'methods' => 'GET',
'callback' => 'roamer_get_featured_posts',
'permission_callback' => '__return_true', // 公開 API
));
});
function roamer_get_featured_posts() {
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
'meta_key' => 'is_featured', // 假設你有用 ACF 設定精選文章
'meta_value' => '1'
);
$query = new WP_Query($args);
$data = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// 只回傳前端需要的乾淨資料
$data[] = array(
'id' => get_the_ID(),
'title' => get_the_title(),
'slug' => get_post_field('post_name', get_the_ID()),
'thumbnail' => get_the_post_thumbnail_url(get_the_ID(), 'medium'),
'excerpt' => get_the_excerpt(),
'date' => get_the_date('Y-m-d'),
);
}
}
wp_reset_postdata();
return new WP_REST_Response($data, 200);
}
這段程式碼的好處是,前端只要呼叫 /wp-json/roamer/v1/featured-posts,就能拿到乾淨的 JSON,不用在那邊解析一整包複雜的 WordPress 物件。
幾個容易踩到的坑
- 權限要分清楚:上例的
permission_callback設為__return_true代表完全公開,只適合公開可讀的內容。任何牽涉到會員或敏感資料的端點,務必改成實際的權限驗證,不要圖方便全開。 - 記得做快取:API 若每次都打到資料庫做
WP_Query,高流量下一樣會慢。可在端點前加上物件快取或 CDN 邊緣快取,讓重複請求不再回源。 - 欄位最小化:只回傳前端真正會用到的欄位(如上例的 id、title、slug、thumbnail、excerpt、date),既省頻寬也降低洩漏內部結構的風險。
CRM 整合:會員驗證的轉移
這部分是大多數專案最容易卡關的地方。在 Headless 架構下,我給的建議很直接:請不要再用 WordPress 的登入系統。
為什麼?因為如果你的前端是分離的,維持 WordPress 的 Session Cookie 會非常痛苦(跨網域問題、安全性問題)。傳統 Cookie-Session 機制預設綁定在單一網域上,一旦前端與後端不同網域,要讓登入狀態正確帶過去會牽扯一堆設定。最佳實踐是改採 JWT(JSON Web Token) 這類無狀態(stateless)的權杖機制,並且讓驗證方直接對接 CRM 或第三方身分驗證服務(如 Auth0)。
典型流程如下:
- 使用者在前端輸入帳號密碼。
- 前端把憑證送往 CRM 的 API(或一個居中的 Middleware 中間層)。
- CRM 驗證成功,回傳一組 Access Token。
- 前端將 Token 妥善保存。
- 之後前端要取得「會員訂單」或「個人資料」時,帶著這個 Token 去問 CRM,完全繞過 WordPress。
Token 該存哪裡?
原文提到 LocalStorage 或 Secure Cookie 兩種選擇,這裡補充取捨原則供你判斷:LocalStorage 存取方便,但因為 JavaScript 可以直接讀取,較容易受到跨站腳本(XSS)攻擊波及;HttpOnly 的 Secure Cookie 由瀏覽器代管、JavaScript 讀不到,能擋掉一部分 XSS 風險,但需要另外處理跨站請求偽造(CSRF)防護。沒有絕對正確答案,請依專案的安全要求決定,並務必全程走 HTTPS。
這樣做的好處是,WordPress 回歸單純的「內容供應商」,它根本不需要知道誰登入了,它只要負責把文章吐出來就好。這也大幅降低了 WordPress 後台被暴力破解登入的風險——因為登入這件事,已經不在它身上了。
改用 React 寫前端,Google 還爬得到我的網站嗎?
這是客戶最常問 Eric 的另一個問題。以前這確實是個大問題:純前端渲染(CSR,Client-Side Rendering)的頁面,初始 HTML 幾乎是空的,內容都靠瀏覽器執行 JavaScript 才長出來,對爬蟲不友善。
但現在有了 Next.js 或 Nuxt.js 這類支援 SSR(Server-Side Rendering,伺服器端渲染) 的框架,這個問題已經解決了。當爬蟲來訪時,伺服器會先抓取 WordPress API、在伺服器端組合成完整的 HTML 再吐給爬蟲。對 Google 來說,它看到的和你傳統 WordPress 網站沒有兩樣,甚至因為程式碼更乾淨、速度更快,SEO 表現反而可能更好。
簡單記住三種渲染模式怎麼挑:
- SSG(靜態生成):適合不常變動的內容(文章、產品介紹),建置時就產好 HTML,配 CDN 速度最快、對 SEO 最友善。
- SSR(伺服器端渲染):適合需要即時、依使用者而異、但又要被爬蟲讀到的頁面,每次請求在伺服器端產生 HTML。
- CSR(純前端渲染):適合登入後的會員中心、後台等不需要被搜尋引擎收錄的互動頁面。
結論:不要為了跟風而 Headless
雖然我是技術控,但我必須誠實地說:Headless 架構並不適合所有人。如果你的網站只是個單純的部落格,或者小型企業形象網,傳統的 WordPress 搭配良好的快取優化(例如使用 Object Cache 與頁面快取)就非常足夠了,硬上 Headless 只是徒增複雜度與成本。
但如果你的企業符合以下特徵,那麼「打造 Headless 商務架構:WordPress + CRM」絕對是值得的投資:
- 你需要極致的前端客製化體驗(例如像 App 一樣的操作感)。
- 你的會員資料庫龐大,且需要與線下 POS 或 ERP 深度整合。
- 你的安全性要求極高,不希望會員個資存在 CMS 系統中。
- 你有專屬的前端開發團隊可以維護。
一句話判斷:內容導向、流量單純 → 留在傳統 WordPress;數據導向、整合複雜、安全敏感 → 才考慮 Headless。數位轉型不是堆砌工具,而是找對架構。希望這篇文章能幫你釐清未來的改版方向!
延伸閱讀
常見問題
WordPress 裝了購物車與行銷外掛後越跑越慢,是該換主機嗎?
Headless 架構下 WordPress、前端與 CRM 各負責什麼?
Headless 架構為什麼能同時提升效能與安全性?
Headless 架構下會員登入該怎麼處理?
自訂 WordPress REST API 端點時有哪些常見的坑?
訂閱免費電子報
把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。