圖片還在手動找?用 OpenAI DALL-E 3 API 打造 WordPress 自動配圖流水線
☰ 目錄 table-of-contents.md
用 OpenAI DALL-E 3 API 打造 WordPress 自動配圖流水線
整套機制其實不難:掛載 WordPress 的 transition_post_status hook,就能在文章發布的瞬間自動把標題組成繪圖指令、呼叫 OpenAI DALL-E 3 API 生成原創圖片,再下載進媒體庫並設為精選圖片,從此不用再手動找圖。
本文要解決的問題是:技術部落格每篇文章都要找配圖,既耗時又有版權與尺寸壓縮的煩惱。下面提供一套可直接複製使用的 PHP 實作,並說明三個會讓你踩坑的關鍵細節(timeout、Prompt 設計、發布卡頓),讓你把這條流水線穩定跑起來。
嗨,我是 Eric,浪花科技的資深工程師。老實說,身為一個寫程式比寫文章快的技術人,我最痛恨的環節往往不是 Debug,而是寫完技術文章後,還要花半小時去圖庫網站找一張「看起來沒那麼尷尬」的配圖。
你懂那種感覺吧?Unsplash 翻了十頁,每一張都像是千禧年的商業簡報,毫無靈魂。更別提還要擔心版權、裁切尺寸、壓縮檔案大小……這對我們這種追求效率的工程師來說,簡直是時間的黑洞。
「既然能用程式碼解決,為什麼要用手做?」這是我的座右銘。今天不聊虛無縹緲的 AI 趨勢,我們來點「硬核」的實作:利用 OpenAI 的 DALL-E 3 API,結合 WordPress 的 Hook 機制,打造一個「文章發布即自動配圖」的自動化流水線。這不僅能節省時間,還能讓你的 SEO 圖片具有絕對的原創性。
為什麼選 DALL-E 3 API,而不是 Midjourney?
很多設計師朋友會問我:「Eric,Midjourney 的畫質不是更好嗎?」
沒錯,Midjourney v6 的光影確實迷人。但從「工程師的自動化思維」來看,Midjourney 目前(截至 2025 年初)仍未提供官方正式的 API,必須透過 Discord Bot 或第三方封裝的 API(不穩定且延遲高)來串接。這對於一個追求穩定運行的企業級 WordPress 網站來說,是一個潛在的風險點。
相對地,OpenAI 的 DALL-E 3 API 提供了極佳的開發者體驗:
- 原生支援:直接透過 OpenAI 官方庫或 REST API 呼叫,穩定性高。
- Prompt 理解力強:你不需要像念咒語一樣寫 Prompt,它對自然語言的理解非常精準,非常適合直接拿「文章標題」或「摘要」來生成圖片。
- 成本可控:Standard 模式的價格對於企業部落格運營來說,完全在可接受範圍內,比買圖庫會員還划算。
簡而言之,這個決策的核心不是「哪個畫質最頂」,而是「哪個能用一支穩定的 API 接進自動化流程」。對需要無人值守、長期運行的系統而言,可程式化、可預期、可監控,永遠優先於單張作品的極致美感。
這條自動化流水線是怎麼運作的?
我們的目標很明確:當編輯在 WordPress 後台按下「發布」按鈕時,系統要自動依序執行以下動作。
- 抓取文章的標題與摘要。
- 將這些文字組合成給 AI 的繪圖指令(Prompt)。
- 呼叫 DALL-E 3 API。
- 將回傳的圖片 URL 下載到 WordPress 媒體庫。
- 將下載的圖片設定為該文章的「精選圖片(Featured Image)」。
為什麼是攔截 transition_post_status?
WordPress 在文章狀態改變時會觸發 transition_post_status 這個 action,並把新狀態、舊狀態、文章物件三個參數一併傳進來。相較於只在發布時觸發的 publish_post,transition_post_status 同時拿得到「新舊狀態」,讓我們可以精準判斷「這是不是一次全新的發布」,避免每次編輯舊文章重新存檔時又重複生成一張新圖、白白燒掉 API 費用。
判斷邏輯就是:只有當新狀態是 publish、而舊狀態不是 publish 時,才執行生成。這是整段程式碼最容易被忽略、卻最省錢的一道防線。
事前準備
你需要先去 OpenAI Platform 申請一組 API Key。記得綁定信用卡,不然額度可能會受限。
完整程式碼實作
請將以下程式碼加入你佈景主題的 functions.php 檔案中,或製作成一個簡單的 Plugin。為了相容經典編輯器與各種環境,我們使用 WordPress 內建、對 cURL 做了封裝的 wp_remote_post 函式。
// 定義 OpenAI API Key (建議放在 wp-config.php 以保安全)
if ( ! defined( 'OPENAI_API_KEY' ) ) {
define( 'OPENAI_API_KEY', 'sk-你的API-Key-填在這裡' );
}
/**
* 當文章狀態轉變為 "publish" 時觸發
*/
function eric_auto_generate_featured_image( $new_status, $old_status, $post ) {
// 1. 檢查是否為新發布的文章 (避免更新舊文章時重複生成)
if ( 'publish' !== $new_status || 'publish' === $old_status ) {
return;
}
// 2. 檢查是否為 "post" 類型 (你可以加入 'page' 或其他 CPT)
if ( 'post' !== $post->post_type ) {
return;
}
// 3. 檢查是否已經有精選圖片 (如果手動設了,就不要覆蓋)
if ( has_post_thumbnail( $post->ID ) ) {
return;
}
// 開始生成流程
$post_title = $post->post_title;
// 設計 Prompt:這一步最關鍵,決定圖片風格
$prompt = "A high-quality, modern, photorealistic featured image for a blog post titled: '{$post_title}'. No text in the image. Minimalist style, suitable for a tech blog.";
// 呼叫 OpenAI DALL-E 3 API
$image_url = eric_call_openai_dalle( $prompt );
if ( $image_url ) {
// 下載並設定為精選圖片
eric_set_image_as_featured( $image_url, $post->ID, $post_title );
}
}
add_action( 'transition_post_status', 'eric_auto_generate_featured_image', 10, 3 );
/**
* 呼叫 DALL-E 3 API 的函式
*/
function eric_call_openai_dalle( $prompt ) {
$api_url = 'https://api.openai.com/v1/images/generations';
$body = [
'model' => 'dall-e-3',
'prompt' => $prompt,
'n' => 1,
'size' => '1024x1024',
];
$response = wp_remote_post( $api_url, [
'headers' => [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . OPENAI_API_KEY,
],
'body' => json_encode( $body ),
'timeout' => 60, // AI 生成需要時間,超時設長一點
] );
if ( is_wp_error( $response ) ) {
error_log( 'OpenAI API Error: ' . $response->get_error_message() );
return false;
}
$data = json_decode( wp_remote_retrieve_body( $response ), true );
if ( isset( $data['data'][0]['url'] ) ) {
return $data['data'][0]['url'];
} else {
error_log( 'OpenAI Response Error: ' . print_r( $data, true ) );
return false;
}
}
/**
* 下載圖片並設為精選圖片
*/
function eric_set_image_as_featured( $image_url, $post_id, $desc ) {
require_once( ABSPATH . 'wp-admin/includes/media.php' );
require_once( ABSPATH . 'wp-admin/includes/file.php' );
require_once( ABSPATH . 'wp-admin/includes/image.php' );
// 下載圖片到媒體庫
$attachment_id = media_sideload_image( $image_url, $post_id, $desc, 'id' );
if ( ! is_wp_error( $attachment_id ) ) {
set_post_thumbnail( $post_id, $attachment_id );
} else {
error_log( 'Image Upload Error: ' . $attachment_id->get_error_message() );
}
}
程式碼逐段解讀
這段程式碼其實是三個各司其職的函式接力完成的,理解它們的分工,日後要客製化才知道改哪裡。
eric_auto_generate_featured_image():守門員。負責三道把關(是否為新發布、是否為post類型、是否已有精選圖),全部通過才往下走。eric_call_openai_dalle():對外通訊。把 Prompt 包成 JSON、帶上Authorization: Bearer標頭打向 API,再從回應的data[0].url取出圖片網址;任何錯誤都用error_log()留下線索,方便日後排查。eric_set_image_as_featured():落地收尾。呼叫 WordPress 的media_sideload_image()把遠端圖片抓回媒體庫,成功後用set_post_thumbnail()綁定為精選圖片。
這裡有個容易被忽略的細節:media_sideload_image() 依賴的函式定義在 wp-admin/includes/ 裡,在前台或排程情境下不一定已經載入,所以函式開頭才需要手動 require_once 這三個檔案,否則會出現「undefined function」的致命錯誤。
資深工程師的注意事項(The "Gotchas")
程式碼看似簡單,但魔鬼藏在細節裡:
- Timeout 設定:DALL-E 3 生成圖片通常需要 10 至 20 秒,而 WordPress 預設的請求 timeout 偏短,沒調整絕對會超時。請務必把
timeout設為 60 秒以上,否則你的 WordPress 會噴出 504 Gateway Timeout 錯誤。 - Prompt Engineering:我在程式碼裡寫死了一段 "No text in the image"(圖片中不要有文字)。這是因為 AI 目前產字還是很容易變成亂碼,破壞美感。你可以依品牌調性修改
$prompt變數,例如加入 "Cyberpunk style" 或 "Watercolor style"。 - 圖片大小:DALL-E 3 標準輸出是 1024x1024。這對精選圖片來說有點方。你可以在後續透過 WordPress 的裁切功能處理,或改用 DALL-E 2(雖然畫質較差)指定長寬比。
進階優化:SEO 與圖片壓縮
自動生成的圖片雖然解決了「有圖」的問題,但如果檔案太大,反而會拖累網站速度,影響 Core Web Vitals 分數。
DALL-E 生成的 PNG 檔案通常在 3MB 左右,直接放在前台是災難。建議搭配圖片優化策略,或使用 n8n 進行更複雜的流程:先把圖片送到 TinyPNG 壓縮、轉檔成 WebP 格式,最後再上傳回 WordPress。
此外,別忘了 Alt Text(替代文字)。上面的程式碼是用文章標題當作描述,但更進階的做法是再呼叫一次 GPT-4o 的 API,請它根據圖片內容生成一段精準的 Alt Text,這才是真正的 SEO 全自動化。
同步執行 vs. 非同步執行,差在哪?
下面這張表是整套架構從「能跑」進化到「好用」的關鍵分水嶺。
| 做法 | 運作方式 | 使用者體感 | 適用情境 |
|---|---|---|---|
| 同步(本文範例) | 按下發布後,當場等 API 生成、下載完才放行 | 會卡頓 10 至 20 秒 | 發文量小、求簡單可先這樣用 |
| 非同步(WP-Cron) | 發布時只登記任務,交給排程稍後處理 | 前台立即返回,幾乎無感 | 正式營運站建議採用 |
| 外部工具(n8n) | WordPress 只丟事件,繁重流程交給外部 workflow | 前台無感,且可串壓縮、轉檔 | 需要複雜後處理或多步驟流程 |
之所以會卡頓,是因為 PHP 在這個情境下是同步、單執行緒地等待外部 API 回應;網路往返與 AI 算圖的時間,全都壓在使用者按下「發布」的那一刻。把這段耗時工作搬離請求週期(offload),就是讓前台恢復順暢的核心思路。
結論:讓工程師回歸創造,讓 AI 處理繁瑣
透過這幾十行 PHP 程式碼,你省下的不只是找圖的時間,更是把精力重新聚焦在「內容創作」與「系統架構」上的機會。AI 生成圖片整合 WordPress 實作並不是要取代設計師,而是要解決那些重複性高、創意需求低的配圖工作。
落地時記得抓住三個重點:用 transition_post_status 的新舊狀態判斷避免重複生成、把 timeout 放寬到 60 秒以上、正式站務必改成非同步處理。掌握這三點,這條流水線就能長期穩定地替你工作。
如果你對這種自動化架構感興趣,或你的企業網站需要更複雜的客製化功能(例如根據不同分類生成不同風格的圖片、串接 Midjourney),歡迎隨時來找我們聊聊。
延伸閱讀
常見問題
WordPress 自動配圖為什麼建議用 OpenAI DALL-E 3 API 而不是 Midjourney?
WordPress 自動生成精選圖片應該掛在哪個 Hook 才不會重複扣費?
呼叫 DALL-E 3 API 時為什麼要把 timeout 設長一點?
OpenAI API Key 應該放在哪裡比較安全?
訂閱免費電子報
把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。