~/blog/n8n-wordpress-automated-content-pipeline-google-sheets-acf.md
API 串接與系統整合 · 2025 / 12 / 07

內容工廠再進化!n8n x WordPress 打造『智慧內容管道』:從 Google Sheets 到自動發布 (含 ACF + 精選圖片)

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
內容工廠再進化!n8n x WordPress 打造『智慧內容管道』:從 Google Sheets 到自動發布 (含 ACF + 精選圖片)
目錄 table-of-contents.md

內容都在 Google Sheets 裡排好了,上架卻還是得一篇篇手動貼進 WordPress:設分類、補標籤、上傳精選圖片,還有 ACF 客製欄位要填,一個下午就這樣蒸發。重複性的「複製、貼上、點擊、發布」循環,不該是內容團隊的日常。這篇用 n8n 打造一條智慧內容管道,從試算表一路自動化到帶 ACF 欄位與精選圖片的正式發布。

今天,我們就要來終結這場惡夢。我要帶你用 n8n 這個強大的自動化工具,打造一條從 Google Sheets 直通 WordPress 的「智慧內容管道」。這不是一篇基礎的「Hello World」教學,我們要玩點進階的:自動設定分類標籤、自動上傳並設定精選圖片,甚至連 ACF (Advanced Custom Fields) 的客製化欄位都能一併搞定。準備好了嗎?讓我們一起把時間搶回來,去做更有價值的事!

為什麼你需要自動化 WordPress 內容發布?

在我們動手之前,先囉嗦幾句,聊聊「為什麼」。很多時候,我們看到一個酷炫的技術,就一頭熱地栽進去,卻忘了問自己,這到底解決了什麼問題。自動化內容發布,絕對不只是為了「懶」。

  • 時間就是金錢(和頭髮):這是最直接的好處。假設你每天要發布 10 篇文章,每篇手動處理需要 5 分鐘,一天就是 50 分鐘,一個月下來就是超過 20 個小時!這些時間拿去優化網站效能、研究新的行銷策略,甚至好好睡一覺,不香嗎?
  • 零失誤的一致性:人會累、會分心、會手滑。分類選錯、標籤打錯字、圖片忘記上傳...這些鳥事在自動化流程中幾乎不會發生。機器只會忠實地執行你設定好的規則,確保每一篇文章的發布都符合標準作業程序 (SOP)。
  • 釋放內容生產力:當發布流程自動化後,你的團隊(或你自己)可以更專注在「內容創作」本身。行銷人員可以在 Google Sheets 上協作、規劃一整個月的內容排程,而不用去碰複雜的 WordPress 後台。內容生產和技術發布徹底解耦,效率自然提升。
  • 規模化的可能性:當你的網站需要處理大量、即時的內容時,例如新聞聚合網站、活動發布平台、電商促銷更新,手動發布根本是天方夜譚。一條穩定的自動化管道,是你實現規模化營運的基礎建設。

架設我們的自動化內容管道:事前準備

工欲善其事,必先利其器。在進入 n8n 的世界前,請確保你的裝備都已備妥:

  • 一個正常的 WordPress 網站:這聽起來像廢話,但確保你的網站是可公開存取且運作正常的。
  • 啟用「應用程式密碼 (Application Passwords)」:這是讓 n8n 這類外部應用程式安全地與你 WordPress 溝通的鑰匙。請到 WordPress 後台的「使用者」>「個人資料」,拉到最下方找到「應用程式密碼」,新增一組密碼並立刻複製保存,因為這個畫面關掉後就再也看不到了。
  • n8n 執行個體:無論是使用 n8n Cloud 還是自己架設,你需要一個可以運作的 n8n 環境。
  • 我們的內容來源 - Google Sheets:建立一個新的 Google Sheet,並規劃好欄位。這就是我們內容的「資料庫」。一個基本的結構可能像這樣:
    • post_title: 文章標題
    • post_content: 文章內容 (可以是 HTML)
    • image_url: 精選圖片的公開網址
    • category_name: 分類名稱 (例如:技術分享)
    • tags: 標籤 (多個請用逗號分隔,例如:n8n,WordPress,自動化)
    • acf_custom_field: 你的 ACF 欄位內容
    • status: 用來標記處理狀態,例如「pending」或「posted」
  • (強烈建議) 安裝 ACF 外掛:如果你想玩到客製化欄位,請先在 WordPress 安裝並啟用 Advanced Custom Fields 外掛,並建立好對應的欄位 (例如:acf_custom_field)。

n8n 工作流實戰:一步步打造發文機器人

好了,理論講完了,讓我們來點硬派的實作。我會將整個工作流拆解成幾個關鍵節點,讓你清楚了解每一步的運作原理。

步驟一:啟動!設定排程觸發器 (Schedule Trigger)

我們的發文機器人需要一個鬧鐘。在 n8n 中,最簡單的方式就是使用「Schedule」節點。你可以設定它每小時、每天或在特定時間執行一次,去 Google Sheets 檢查有沒有新的內容需要發布。

步驟二:抓取資料來源 - 連接 Google Sheets

新增一個「Google Sheets」節點。第一次使用需要授權 n8n 存取你的 Google 帳號。設定如下:

  • Operation: Read
  • Spreadsheet ID: 填入你的 Google Sheet ID (網址列那一長串亂碼)。
  • Sheet Name: 你的工作表名稱。
  • Options > Unformatted Values: 建議勾選,避免格式問題。

執行後,你應該能看到 n8n 成功抓取了你試算表中的所有資料列。接下來,我會加上一個「IF」節點,只處理 status 欄位是「pending」的資料,避免重複發文。

步驟三:處理分類與標籤 ID(工程師的囉嗦時間)

這是最多人卡關的地方。WordPress 的 REST API 非常「嚴謹」,它在設定分類 (Categories) 和標籤 (Tags) 時,要的是它們的 ID (一串數字),而不是名稱 (例如「技術分享」)。直接把文字丟過去是行不通的。

那怎麼辦?我們的流程要這樣設計:

  1. 取得所有分類:新增一個「WordPress」節點,Resource 選 Category,Operation 選 Get Many。這會回傳你網站上所有分類的名稱和對應的 ID。
  2. 進行匹配:新增一個「Code」節點 (以前叫 Function node)。我們要用一點點 JavaScript,來比對 Google Sheets 來的分類名稱 (category_name) 和上一步取得的分類列表,找出正確的 ID。

這段程式碼大概會長這樣:

// 假設上一個節點(取得所有分類)的輸出在 $input.all() 中
const categories = $input.all();
const targetCategoryName = $json.category_name;

// 尋找對應的分類物件
const foundCategory = categories.find(cat => cat.json.name === targetCategoryName);

// 如果找到,就回傳它的 ID,否則回傳 null 或一個預設值
if (foundCategory) {
  $json.categoryId = foundCategory.json.id;
} else {
  // 這裡可以做錯誤處理,例如設定一個預設分類 ID
  $json.categoryId = 1; // 假設 1 是「未分類」
}

return $json;

標籤的處理邏輯也完全一樣,只是 Resource 要改成 Tag。我知道這有點麻煩,但這就是跟 API 打交道的日常。精確,才能不出錯。

步驟四:視覺焦點 - 上傳並設定精選圖片

精選圖片也不是一步到位。你需要先將圖片上傳到 WordPress 的媒體庫,取得一個 Media ID,然後再把這個 ID 關聯到你的新文章上。

  1. 下載圖片:新增一個「HTTP Request」節點。URL 欄位對應到 Google Sheets 的 image_url。最重要的一步是,在下方的 Options 中,將 Response Format 設定為 File。這樣 n8n 才會把圖片當成二進位檔案下載下來。
  2. 上傳到媒體庫:新增一個「WordPress」節點。Resource 選 Media,Operation 選 Upload。在 Binary Data? 這個開關要打開,然後在 Input Data Field Name 選擇上一步 HTTP Request 節點輸出的 data。執行成功後,這個節點會回傳包含 id 的 JSON,這就是我們夢寐以求的 Media ID。

步驟五:終極整合 - 建立 WordPress 文章!

萬事俱備,只欠東風!現在新增最後一個「WordPress」節點,進行最終的組裝:

  • Authentication: 選擇你設定好的應用程式密碼憑證。
  • Resource: Post
  • Operation: Create
  • Title: {{ $json.post_title }} (從 Google Sheets 節點來的資料)
  • Content: {{ $json.post_content }}
  • Status: Publish (或 Draft)
  • Additional Fields:
    • Categories: {{ $('Code').item.json.categoryId }} (從我們剛剛處理分類ID的 Code 節點來的資料)
    • Tags: (同理,從處理標籤的節點來)
    • Featured Media: {{ $('WordPress1').item.json.id }} (假設上傳圖片的節點叫 WordPress1,從那裡取得 Media ID)
    • Fields to Set > Meta: 點擊 Add Meta Field,Key 填入你的 ACF 欄位名稱 (例如 acf_custom_field),Value 填入 {{ $json.acf_custom_field }}

步驟六:善後 - 更新 Google Sheets 狀態

文章發布成功後,我們要做最後一個重要的動作:回去更新 Google Sheets 上那一列的 status 為「posted」。這樣下次 n8n 執行時,就不會重複處理這一筆資料了。

新增一個「Google Sheets」節點,Operation 改為 Update。你需要指定 Row Number (可以從觸發器節點的資訊中獲得),然後將 status 欄位的值更新為「posted」。

結論:你不只省下時間,更打造了內容引擎

恭喜你!跟著這一系列複雜但邏輯清晰的步驟,你已經成功打造了一條全自動、可擴展、且高度客製化的內容發布管道。從現在開始,你或你的團隊只需要專注於在 Google Sheets 上產出高品質的內容,剩下的發布、排版、設定,就交給 n8n 這個 24 小時不打烊的忠實員工吧。

這就是自動化的魅力。它不是取代你,而是把你從重複的勞動中解放出來,讓你成為一個「系統的設計者」而非「流程的執行者」。今天我們用的是 Google Sheets,但這個模式可以輕易地擴展到任何資料來源,例如 RSS Feed、Airtable、甚至是其他網站的 API。你的 WordPress 網站不再是一個被動的內容容器,而是一個能主動拉取、處理、發布資訊的「內容引擎」。


延伸閱讀

對打造更複雜的企業級自動化流程有興趣嗎?或是覺得這些設定太過繁瑣,需要專業團隊為你量身打造?歡迎與浪花科技聯繫,讓我們幫助您將更多重複的工作交給自動化,專注於業務的核心成長!

// FAQ

常見問題

自動化 WordPress 內容發布有什麼實際好處?
主要好處包括省下大量重複手動上架的時間、靠機器忠實執行規則達成零失誤的一致性、讓團隊更專注於內容創作本身(內容生產與技術發布解耦),以及在需要處理大量即時內容時實現規模化營運。它解決的是「複製、貼上、點擊、發布」這類重複工作的痛點。
n8n 要透過什麼方式安全地連到 WordPress 發文?
使用 WordPress 的「應用程式密碼(Application Passwords)」。到後台「使用者 → 個人資料」最下方找到「應用程式密碼」,新增一組並立刻複製保存,因為畫面關掉後就再也看不到。這組密碼讓 n8n 這類外部應用程式能安全地與 WordPress 溝通。
為什麼用 n8n 設定 WordPress 分類和標籤時不能直接填名稱?
因為 WordPress 的 REST API 在設定分類與標籤時要的是它們的 ID(數字),而不是名稱。直接把文字丟過去是行不通的。正確做法是先用 WordPress 節點以 Get Many 取得所有分類或標籤的名稱與 ID,再用 Code 節點比對來源名稱找出對應的 ID。
n8n 自動上傳精選圖片到 WordPress 的步驟為何?
精選圖片無法一步到位,要分兩段:先用 HTTP Request 節點下載圖片,並把 Response Format 設為 File,讓 n8n 以二進位檔案接收;再用 WordPress 節點選 Resource 為 Media、Operation 為 Upload,打開 Binary Data 開關上傳,成功後會回傳一個 Media ID。最後在建立文章時把這個 Media ID 設到 Featured Media 欄位。
如何避免 n8n 排程重複發布同一筆內容?
在 Google Sheets 加一個 status 欄位標記處理狀態(如 pending、posted),並在工作流中加上 IF 節點,只處理 status 為「pending」的資料列。發布完成後再更新狀態,就能避免同一筆內容被重複發文。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?