Google Sheets 驅動的 WordPress 動態內容管理
資深工程師 Eric 揭示了解決 WordPress 後台重複輸入地獄的終極方案:將 Google Sheets 轉化為動態內容 CMS。透過低程式碼自動化神器 n8n,您可以輕鬆同步活動列表或產品目錄等結構化內容。核心技術是建立「唯一識別碼 (Unique Key)」,確保 n8n 能精準判斷並執行新增或更新,實現一處修改、全網同步的魔法。別再將寶貴的工程時間浪費在複製貼上了!立即掌握這項神兵利器,讓您的內容協作更便利、效率飆升,現在就開始打造您的智慧內容工廠!
Google Sheets 當 CMS 用?資深工程師教你用 n8n 打造 WordPress 動態內容『儀表板』,告別後台編輯地獄!
嗨,我是浪花科技的資深工程師 Eric。在我們團隊,每天都在跟 WordPress 的各種疑難雜症打交道。有個場景你肯定不陌生:行銷同事又丟來一個 Excel 表,上面有 50 場即將舉辦的活動,要你一個個手動 key-in 到 WordPress 後台。標題、日期、講者、地點…複製貼上到眼花撩亂,一不小心還會貼錯欄位。更慘的是,下禮拜這份表單更新了 20 筆資料,你又要玩一次「大家來找碴」的遊戲。
身為一個有格調的工程師,這種重複性的勞動簡直是對靈魂的拷問。難道就沒有更優雅、更自動化的方式嗎?當然有。今天,我就要帶你玩點進階的,我們要把大家最熟悉的 Google Sheets,直接變成 WordPress 的動態內容「儀表板」,透過低程式碼自動化神器 n8n,實現一處修改、全網同步的魔法。這不只是單純的把 Google Sheets 的內容批次發佈到 WordPress,我們要做到的是「管理」——新增、更重要的是「更新」現有內容,真正把 Google Sheets 當作一個簡易的 CMS (內容管理系統) 來用。
為什麼要用 Google Sheets 管理 WordPress 內容?這不是自找麻煩嗎?
我知道,聽到這個點子,你腦中可能第一個浮現的是:「蛤?放著好好的 WordPress 後台不用,跑去用試算表?這不是脫褲子放屁嗎?」先別急著下定論,聽我這個老司機分析一下,在某些特定情境下,這招簡直是神兵利器:
- 協作便利性無可比擬: 你不可能期待所有行銷、營運、PM 同事都熟悉 WordPress 後台的操作,尤其是那些充滿了 ACF 或 Metabox 客製化欄位的複雜後台。但 Google Sheets?幾乎是人人上手的基本技能。你只需要把表單權限開給他們,定義好欄位,他們就能輕鬆協作,而你,身為工程師,再也不用當人肉資料搬運工。
- 無敵的批次處理能力: 想像一下,你需要一次更新 100 個產品的規格參數,或是一次調整 30 位團隊成員的職稱。在 WordPress 後台,這是一場點擊馬拉松。但在 Google Sheets,這不過是下拉、取代、公式運算的事,幾分鐘就能搞定。
- 內建版本控制與歷史紀錄: 「欸,Eric,上週二下午是誰把 A 活動的日期改錯了?」這種問題在 WordPress 裡很難追溯,但在 Google Sheets,你可以輕鬆調閱完整的修訂歷史紀錄,誰在什麼時間改了哪個儲存格,一目了然,甩鍋都甩不掉。
- 資料的再利用與分析: 當你的內容以結構化方式存在於 Google Sheets 時,你可以輕易地使用它的圖表、樞紐分析等功能來做數據分析,甚至將這份資料源串接到其他 BI 工具,這是關在 WordPress 資料庫裡的內容難以企及的彈性。
當然,我得囉嗦一句,這個方法不是萬靈丹。如果你的內容是像部落格文章這樣,包含大量複雜排版、圖文混編的非結構化內容,那還是乖乖用 WordPress 編輯器吧。但如果是管理活動列表、產品目錄、團隊成員、分店資訊、作品集…這類「資料驅動」的內容,那 Google Sheets + n8n 絕對是你的效率加速器。
實戰開始:架構我們的『Google Sheets 驅動』內容更新系統
好了,觀念溝通完,我們來動手。要打造這套系統,核心思想只有一個:建立一個獨一無二的「對應鑰匙 (Unique Key)」。這就像是每個人的身分證字號,確保我們在 Google Sheets 裡的每一列資料,都能精準地對應到 WordPress 裡的某一篇文章,這樣 n8n 才知道到底該「更新」誰,而不是傻傻地每次都「新增」。
第一步:準備 WordPress 環境 (CPT 與客製化欄位)
假設我們要管理一個「活動列表 (Events)」。首先,我們需要在 WordPress 建立一個名為 `event` 的自訂文章類型 (Custom Post Type, CPT),並用 ACF (Advanced Custom Fields) 外掛幫它加上幾個欄位:
- 活動 ID (event_id): 這就是我們的 Unique Key! 欄位類型設為「文字」。它絕對不能重複。
- 活動日期 (event_date): 欄位類型設為「日期選擇器」。
- 活動地點 (event_location): 欄位類型設為「文字」。
如果你不想用外掛,也可以把下面這段程式碼加到你主題的 `functions.php` 檔案裡,來手動註冊 CPT。但老實說,為了後續維護,用 ACF 還是比較方便管理的。
<?php
function register_event_post_type() {
$labels = array(
'name' => _x( '活動', 'Post type general name', 'textdomain' ),
'singular_name' => _x( '活動', 'Post type singular name', 'textdomain' ),
'menu_name' => _x( '活動列表', 'Admin Menu text', 'textdomain' ),
'name_admin_bar' => _x( '活動', 'Add New on Toolbar', 'textdomain' ),
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'events' ),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'supports' => array( 'title', 'editor', 'thumbnail' ),
'show_in_rest' => true, // 非常重要!要讓 REST API 抓得到
);
register_post_type( 'event', $args );
}
add_action( 'init', 'register_event_post_type' );
?>
第二步:準備 Google Sheets 資料源
接著,建立一個 Google Sheet,欄位名稱最好跟 WordPress 的欄位對應起來,方便管理。注意,`event_id` 這一欄是我們自己定義的,必須是獨一無二的,例如 `EVENT-2024-001`、`EVENT-2024-002`。
你的表單看起來會像這樣:
- Column A: event_id
- Column B: title
- Column C: event_date
- Column D: event_location
- Column E: content
n8n 工作流拆解:從讀取到更新,一步步打造自動化引擎
重頭戲來了!打開你的 n8n,我們要來畫一個聰明的自動化流程圖。
節點 1: 定時觸發 (Cron)
新增一個 `Cron` 節點,設定一個你認為合適的執行頻率,例如每 15 分鐘跑一次。這代表 n8n 會每 15 分鐘就去檢查一次 Google Sheets 有沒有更新。
節點 2: 讀取 Google Sheets 資料 (Google Sheets)
新增 `Google Sheets` 節點。驗證你的 Google 帳號後,選擇 `Read` 操作,指向你剛剛建立的那個試算表和工作表。記得勾選 `Read all data`。
節點 3: 迴圈處理每一列 (Split In Batches)
從 Google Sheets 拿回來的是一個包含很多列資料的陣列。我們需要一列一列地處理。使用 `Split In Batches` 節點,並將 `Batch Size` 設定為 1。這樣,後續的節點就會為每一列資料都執行一次。
節點 4: 查詢 WordPress 是否已存在 (WordPress)
這是整個流程最關鍵的核心!新增一個 `WordPress` 節點。
- Resource: `Post`
- Operation: `Get Many`
- Post Type: 選擇你建立的 `event`
- 點擊 `Add Filter`,選擇 `By Meta Key`
- Key: 輸入 `event_id` (你 ACF 欄位的名稱)
- Value: 點擊旁邊的齒輪,選擇 `Add Expression`,然後從 `Nodes > SplitInBatches > Output Data > JSON > columns` 裡面,拖曳 `event_id` 這個變數進來。完整的表達式會類似:`{{$json[“columns”][“event_id”]}}`
這個節點的作用就是拿著 Google Sheets 每一列的 `event_id`,去 WordPress 資料庫裡問:「嘿!有沒有文章的 `event_id` 欄位是這個值的?」
節點 5: 判斷與分流 (IF)
新增一個 `IF` 節點。我們要用它來判斷上一步的查詢結果。
- 在 `Value 1` 中,使用表達式 `{{$items(0).json.length}}` 來取得上一個 WordPress 節點回傳的資料筆數。
- Operation: `Larger Than`
- Value 2: `0`
如果回傳的資料筆數大於 0,代表 WordPress 裡「已經存在」這篇文章(走 `true` 路徑);如果等於 0,代表是新資料,需要被建立(走 `false` 路徑)。
節點 6A (True 路徑): 更新現有文章 (WordPress)
從 IF 節點的 `true` 輸出端拉一條線,再新增一個 `WordPress` 節點。
- Resource: `Post`
- Operation: `Update`
- Post Type: `event`
- Post ID: 這裡要填入上上一步(節點 4)查到的文章 ID。表達式會是: `{{$node[“WordPress”].json[0].id}}`
- Title: 從 `SplitInBatches` 節點拖曳 `title` 變數。
- 點擊 `Add Field`,選擇 `Meta Data`,然後把 `event_date`, `event_location` 等欄位,一一對應到 `SplitInBatches` 的變數。
節點 6B (False 路徑): 建立新文章 (WordPress)
從 IF 節點的 `false` 輸出端拉一條線,新增最後一個 `WordPress` 節點。
- Resource: `Post`
- Operation: `Create`
- Post Type: `event`
- Status: `Publish`
- 同樣地,把 `Title`, `Meta Data` (包含 `event_id` 本身也要存進去!) 等所有欄位都從 `SplitInBatches` 節點對應過來。
恭喜你!啟動這個 n8n workflow,現在你的 Google Sheets 就真的變成了一個動態儀表板。無論你在表單上新增一列,還是修改任何一個儲存格的內容,最慢在 15 分鐘內,你的 WordPress 網站就會自動同步更新,完全無需你手動介入。
進階思考與工程師的囉嗦
做到這裡,系統已經能跑了,但身為資深工程師,總是要多想幾步,讓系統更強固。
刪除怎麼辦?
目前的流程只處理了新增和更新,但如果你在 Google Sheets 刪除了一列,WordPress 裡的對應文章並不會消失。一個簡單的作法是在 Google Sheets 新增一個 `status` 欄位,當你想刪除某篇文章時,就把 status 改成 `archived` 或 `deleted`。然後在 n8n 的更新流程中,多一個判斷:如果 status 是 `archived`,就把 WordPress 裡的文章狀態改成「草稿」或「待審」,而不是真的刪除,這樣會比較安全。
效能與即時性
如果你的 Google Sheets 有幾千、幾萬列資料,每 15 分鐘全部掃描一次,對 API 的呼叫次數和執行時間都是不小的負擔。這時候,更好的作法是改用 Webhook。你可以透過 Google Apps Script 寫一小段程式,讓 Google Sheets 在「有編輯時」才主動發送一個 Webhook 通知給 n8n,n8n 只處理被變動的那一列資料。這就從「輪詢 (Polling)」變成了「事件驅動 (Event-driven)」,效率會高非常多。這也牽涉到更深層的Webhook 與 Polling 的架構選擇,值得深入研究。
錯誤處理的藝術
自動化流程最怕的就是「默默地壞掉」。萬一哪天 WordPress 主機掛了,或是 Google API 權限過期,你的 n8n 流程執行失敗,你卻不知道,那資料就會停止同步。專業的做法是在 n8n 流程中加入錯誤處理機制,例如設定一個「Error Trigger」節點,一旦主流程發生錯誤,就觸發另一個流程,發送一條 LINE Notify 或 Slack 通知給你,讓你能第一時間介入處理。這才是打造企業級強韌工作流的關鍵心法。
希望今天的分享能為你打開一扇新的大門,讓你看到 WordPress 與自動化工具結合的巨大潛力。下次再遇到需要大量更新資料的場景,別再埋頭苦幹了,試試看這個方法,把時間留給更有創造力的事情吧!
延伸閱讀
- 內容工廠再進化!n8n x WordPress 打造『智慧內容管道』:從 Google Sheets 到自動發布 (含 ACF + 精選圖片)
- 網站更新老是慢半拍?兇手竟是 Polling!Webhook vs. Polling 終極對決,選對策略讓資料同步秒速到位
- 你的 n8n 自動化是『玻璃大砲』嗎?資深工程師的『容錯』與『重試』設計聖經,打造企業級強韌工作流
如果你對於打造更複雜的 WordPress 自動化流程,或是需要將現有系統與 WordPress 進行深度整合有任何想法,卻不知從何下手,浪花科技的團隊擁有豐富的 API 串接與客製化開發經驗。歡迎與我們聯繫,讓我們一起聊聊如何讓你的網站變得更聰明、更有效率!
常見問題 (FAQ)
Q1: n8n 和 Zapier 有什麼不同?為什麼要選擇 n8n?
A: 兩者都是優秀的自動化工具,但主要差異在於 n8n 是開源的,你可以選擇自行架設 (Self-hosted),這代表著更高的彈性、更低的成本(特別是當流程執行次數非常多時),以及對資料隱私的完全掌控。對於需要處理複雜邏輯、多分岔流程的開發者來說,n8n 的視覺化介面和節點設計通常也提供更高的自由度。
Q2: 這種用 Google Sheets 管理內容的方法,適合所有類型的 WordPress 網站嗎?
A: 不完全是。這個方法最適合用來管理「結構化、資料驅動」的內容,例如:活動列表、產品目錄、團隊成員介紹、分店資訊、常見問答集等。這些內容的共通點是它們有固定的欄位格式。對於像是部落格文章、新聞稿這類需要複雜排版、圖文穿插的長篇內容,還是建議使用 WordPress 內建的 Gutenberg 編輯器或傳統編輯器,體驗會更好。
Q3: 如果我的 Google Sheets 資料量非常大(例如上千列),這個流程會不會有問題?
A: 會的,效能可能會是個問題。如果使用 Cron 定時觸發,每次執行都會完整讀取、迴圈處理上千列資料,這會消耗大量時間和 n8n 伺服器資源。對於大規模數據,強烈建議改用「事件驅動」的方式,也就是透過 Google Apps Script 在儲存格被編輯時,主動觸發 n8n 的 Webhook,只傳送被更動的那一列資料。這樣可以大幅提升效率與即時性。
Q4: 我完全不會寫程式,有辦法完成這個自動化設定嗎?
A: 絕大部分是可以的。n8n 本身就是一個低程式碼 (Low-code) 工具,整個流程的搭建都是透過拖拉節點和圖形化介面設定完成,不需要寫程式。唯一可能需要程式碼的地方是在 WordPress 中建立「自訂文章類型 (CPT)」,但你也可以使用像 `Custom Post Type UI` 這類外掛來完成,或者直接使用我們文章中提供的範例程式碼。整體來說,對非開發者也是相當友善的。





