~/blog/wordpress-openai-dall-e-3-image-automation-guide.md
API 串接與系統整合 · 2026 / 01 / 09

圖片還在手動找?用 OpenAI DALL-E 3 API 打造 WordPress 自動配圖流水線

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
圖片還在手動找?用 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 後台按下「發布」按鈕時,系統要自動依序執行以下動作。

  1. 抓取文章的標題與摘要。
  2. 將這些文字組合成給 AI 的繪圖指令(Prompt)。
  3. 呼叫 DALL-E 3 API。
  4. 將回傳的圖片 URL 下載到 WordPress 媒體庫。
  5. 將下載的圖片設定為該文章的「精選圖片(Featured Image)」。

為什麼是攔截 transition_post_status?

WordPress 在文章狀態改變時會觸發 transition_post_status 這個 action,並把新狀態、舊狀態、文章物件三個參數一併傳進來。相較於只在發布時觸發的 publish_posttransition_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")

程式碼看似簡單,但魔鬼藏在細節裡:

  1. Timeout 設定:DALL-E 3 生成圖片通常需要 10 至 20 秒,而 WordPress 預設的請求 timeout 偏短,沒調整絕對會超時。請務必把 timeout 設為 60 秒以上,否則你的 WordPress 會噴出 504 Gateway Timeout 錯誤。
  2. Prompt Engineering:我在程式碼裡寫死了一段 "No text in the image"(圖片中不要有文字)。這是因為 AI 目前產字還是很容易變成亂碼,破壞美感。你可以依品牌調性修改 $prompt 變數,例如加入 "Cyberpunk style" 或 "Watercolor style"。
  3. 圖片大小: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),歡迎隨時來找我們聊聊。

延伸閱讀

// FAQ

常見問題

WordPress 自動配圖為什麼建議用 OpenAI DALL-E 3 API 而不是 Midjourney?
因為 OpenAI DALL-E 3 提供官方正式的 REST API,可直接透過 HTTP 呼叫,穩定性高且可程式化、可監控。Midjourney 目前主要透過 Discord Bot 或第三方封裝 API 串接,對需要無人值守長期運行的網站來說風險較高。對自動化流程而言,穩定可預期的 API 比單張作品的極致畫質更重要。
WordPress 自動生成精選圖片應該掛在哪個 Hook 才不會重複扣費?
建議掛在 transition_post_status,因為它會同時傳入新狀態、舊狀態與文章物件三個參數。只有當新狀態是 publish 且舊狀態不是 publish 時才執行生成,可精準判斷「全新發布」,避免每次編輯舊文章重新存檔時又重複呼叫 API 生成新圖。
呼叫 DALL-E 3 API 時為什麼要把 timeout 設長一點?
因為 AI 生成圖片需要時間,預設的 timeout 可能不足以等到回應就先中斷。範例中將 wp_remote_post 的 timeout 設為 60 秒,給生成流程足夠的等待時間,避免因逾時而拿不到圖片 URL。
OpenAI API Key 應該放在哪裡比較安全?
建議將 API Key 定義在 wp-config.php 中(例如以 define 設定 OPENAI_API_KEY 常數),而不是直接寫死在主題的 functions.php 裡,以降低金鑰外洩的風險。同時記得在 OpenAI Platform 申請金鑰並綁定信用卡,避免額度受限。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

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

$
// final.exec()

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