~/blog/wordpress-gemini-api-sentiment-analysis-automation-2026.md
API 串接與系統整合 · 2026 / 02 / 17

Gemini API x WordPress:自動化客服情緒偵測與危機分流實戰

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
Gemini API x WordPress:自動化客服情緒偵測與危機分流實戰
目錄 table-of-contents.md

一封暴怒的客訴信和一封普通詢價信,在收件匣裡排著同樣的處理順位,等輪到它時客戶早已在社群上開罵——這是多數客服流程的真實寫照。其實只要在表單送出的當下接上 Gemini API 做情緒偵測,高風險訊息就能即時分流、直送負責人。這篇從 WordPress 端到 API 端,把整套自動化危機分流系統完整實作一遍。

現在是 2026 年了,如果你還在讓你的客服團隊(或是你自己)一封一封手動點開「聯絡我們」的表單,然後深呼吸一口氣祈禱不是來罵人的,那你真的該更新一下工作流了。我們都知道,處理客訴最累的不是解決問題,而是那個「不知道下一封信會不會炸開」的心理壓力。

今天這篇文章,我不談什麼高大上的 AI 哲學,我們要來點「硬核」的實作。我要教你如何在 WordPress 中串接 Google Gemini API(我們假設是目前性價比最高的 Gemini 1.5 Pro 或 2.0 Flash 模型),在客戶按下「送出」表單的那一毫秒,自動判讀他的情緒指數。如果是來道謝的,自動歸檔;如果是來「炎上」的,系統直接繞過工讀生,秒速通知主管。

這不是魔法,這是 2026 年該有的基本自動化工程。

為什麼選擇 Gemini API 而不是 OpenAI?

身為一個精打細算的工程師,選型(Tech Stack Selection)是我們的天職。雖然我在其他專案也用 GPT-4o,但在處理「大量文本分析」這件事上,2026 年的 Google Gemini 有幾個絕對優勢:

  • 長文本窗口(Context Window): 客戶寫起客訴信來有時候比寫小說還長,Gemini 的 token 吞吐量大,不會讓你炸預算。
  • 原生 JSON 模式: 對於後端工程師來說,能穩定吐出 JSON 格式的 AI 才是好 AI。我們不需要在那邊用正規表示式(Regex)去剖析它的回答,那簡直是地獄。
  • 回應速度: 在 Flash 模型的加持下,延遲極低,適合即時的 Webhook 處理。

架構設計:從表單到情緒標籤的自動化流水線

在開始寫 Code 之前,Eric 習慣先畫架構圖(雖然這裡沒圖,但請跟著我的邏輯走)。我們的目標是打造一個「中介層(Middleware)」,攔截表單數據。

  1. 觸發點 (Trigger): 使用者填寫 WordPress 表單(例如 Contact Form 7, WPForms, 或自幹的表單)。
  2. 攔截 (Hook): 利用 WordPress 的 `save_post` 或表單外掛提供的 Action Hook 攔截數據。
  3. 分析 (Analyze): 將內容打包,透過 `wp_remote_post` 發送給 Gemini API。
  4. 決策 (Decision): 取得 AI 回傳的 JSON(包含情緒分數、關鍵字、摘要)。
  5. 行動 (Action):
    • 將情緒標籤寫入 `post_meta`。
    • 如果是「極度憤怒」,觸發 Email 或 Slack 通知。

實戰程式碼:PHP 串接 Gemini API

我知道你們是用經典編輯器(Classic Editor)或者習慣直接在 `functions.php` 裡貼程式碼(雖然我建議寫成外掛,但為了教學方便,我們先這樣做)。

首先,我們需要一個與 Gemini 溝通的函式。請注意,千萬不要把 API Key 直接寫死在程式碼裡,請放在 `wp-config.php` 定義常數,這是資安基本常識,好嗎?

1. 設定 API 金鑰

在 `wp-config.php` 加入:

define( 'GEMINI_API_KEY', '你的_GOOGLE_AI_STUDIO_KEY' );

2. 撰寫 API 請求函式

這段程式碼負責把文字丟給 Gemini,並要求它只回傳 JSON。這裡我加了一些工程師的小囉嗦註解,方便你除錯。


function eric_analyze_sentiment_with_gemini( $user_message ) {
    if ( ! defined( 'GEMINI_API_KEY' ) ) {
        error_log( 'Gemini API Key 未設定,請檢查 wp-config.php' );
        return false;
    }

    $api_url = 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=' . GEMINI_API_KEY;

    // 這段 Prompt 是關鍵,我們要 AI 變成一個資深的客服經理
    // 強制輸出 JSON 格式,不要廢話
    $prompt_text = "你是一位資深的客戶關係經理。請分析以下客戶回饋內容。\n"
        . "內容:\"" . esc_js( $user_message ) . "\"\n"
        . "請務必只回傳符合以下格式的 JSON 字串,不要包含 Markdown 標記或其他文字:\n"
        . "{\n"
        . "  \"sentiment\": \"Positive\" | \"Neutral\" | \"Negative\",\n"
        . "  \"score\": (1-10分,10為最憤怒/負面,1為最開心/正面),\n"
        . "  \"summary\": \"一句話摘要重點\",\n"
        . "  \"urgent\": true | false (如果分數大於 7 則為 true)\n"
        . "}";

    $body = [
        'contents' => [
            [
                'parts' => [
                    ['text' => $prompt_text]
                ]
            ]
        ],
        'generationConfig' => [
            'responseMimeType' => 'application/json' // 2026年必備設定,強制 JSON
        ]
    ];

    $response = wp_remote_post( $api_url, [
        'headers' => ['Content-Type' => 'application/json'],
        'body'    => json_encode( $body ),
        'timeout' => 15 // AI 有時候會想比較久,給它點時間
    ] );

    if ( is_wp_error( $response ) ) {
        error_log( 'Gemini API 連線失敗: ' . $response->get_error_message() );
        return false;
    }

    $body_content = wp_remote_retrieve_body( $response );
    $data = json_decode( $body_content, true );

    // 解析 Gemini 獨特的 JSON 結構,這層結構真的很深...
    if ( ! empty( $data['candidates'][0]['content']['parts'][0]['text'] ) ) {
        $ai_json_string = $data['candidates'][0]['content']['parts'][0]['text'];
        return json_decode( $ai_json_string, true );
    }

    return false;
}

自動化分流:當「暴怒」來襲時

有了上面的分析函式,我們就能在表單送出後做很多事。這裡以 WordPress 內建的文章儲存為例(假設你的聯絡表單會存成 Post Type)。


function eric_process_feedback_sentiment( $post_id, $post, $update ) {
    // 避免無限迴圈和自動存檔
    if ( wp_is_post_revision( $post_id ) || wp_is_post_autosave( $post_id ) ) return;
    if ( 'customer_feedback' !== $post->post_type ) return; // 假設你的 Post Type 叫 customer_feedback

    // 檢查是否已經分析過,避免重複扣 API Quota
    if ( get_post_meta( $post_id, '_is_analyzed', true ) ) return;

    $message = $post->post_content;
    $analysis = eric_analyze_sentiment_with_gemini( $message );

    if ( $analysis ) {
        // 1. 存入情緒標籤
        update_post_meta( $post_id, 'sentiment_score', $analysis['score'] );
        update_post_meta( $post_id, 'sentiment_label', $analysis['sentiment'] );
        update_post_meta( $post_id, 'ai_summary', $analysis['summary'] );
        
        // 標記已分析
        update_post_meta( $post_id, '_is_analyzed', true );

        // 2. 危機處理邏輯
        if ( $analysis['urgent'] === true ) {
            // 這裡可以串接 Slack Webhook 或寄信給老闆
            $admin_email = get_option( 'admin_email' );
            $subject = "[緊急警報] 偵測到高風險客訴 (分數: {$analysis['score']})";
            $body = "摘要:{$analysis['summary']}\n\n原始內容:\n{$message}";
            
            wp_mail( $admin_email, $subject, $body );
            
            // 工程師小語:這時候最好也傳個 LINE 給自己,因為 Email 很常被忽略
        }
    }
}
add_action( 'save_post', 'eric_process_feedback_sentiment', 10, 3 );

進階思考:除了憤怒,我們還能偵測什麼?

雖然「偵測暴怒」很爽,但身為資深工程師,我們要看更長遠的價值。透過 Gemini API,你還可以做:

  • 自動分類: 讓 AI 判斷這是「產品瑕疵」、「物流問題」還是「退款請求」,自動分配給不同部門。
  • 銷售機會偵測: 如果 AI 偵測到客戶說「我很喜歡這產品,如果有紅色更好」,這就是潛在的 Upsell 機會,自動標記為「高價值客戶」。
  • 多語言支援: 2026 年的市場是全球的,Gemini 可以無痛處理英文、日文、泰文客訴,並統一輸出中文摘要給你。

結語:技術是為了讓人更優雅地工作

導入 AI 不是為了取代客服,而是為了保護客服的心理健康,讓他們把精力花在真正需要安撫的客戶身上,而不是消耗在閱讀垃圾訊息中。上面的程式碼只是基礎,實際應用中,你可能還需要考慮 Queue (佇列) 機制來處理大量併發請求,避免 API Rate Limit。

如果你覺得這一堆程式碼看了頭很痛,或者你想直接要一套企業級、包含 Slack 通知與 CRM 整合的完整方案,別客氣,這種髒活累活交給我們來做。

延伸閱讀

如果你對 AI 與 WordPress 的自動化整合有興趣,強烈建議閱讀以下幾篇深度技術文章,別讓你的網站只停留在 Web 2.0 時代:

不想自己手刻 API?想要直接導入企業級的 AI 客服分流系統?

立即聯繫浪花科技,讓我們幫你打造 24H 智慧守門員
// FAQ

常見問題

做客服文本情緒分析時,為什麼選 Gemini API 而不是 OpenAI?
在大量文本分析的情境下,Gemini 有幾個優勢:長文本窗口能容納冗長的客訴信而不易爆預算;原生 JSON 模式能穩定吐出 JSON 格式,後端不必再用正規表示式去剖析回答;在 Flash 模型加持下延遲極低,適合即時的 Webhook 處理。
如何在 WordPress 表單送出後自動分析客戶情緒並分流?
建立一個中介層攔截表單數據:使用者填寫表單後,透過 WordPress 的 Hook(如 save_post 或表單外掛的 Action Hook)攔截內容,用 wp_remote_post 送給 Gemini API 分析,取得包含情緒分數、關鍵字與摘要的 JSON,再把情緒標籤寫入 post_meta;若判定為極度憤怒,就觸發 Email 或 Slack 通知主管。
如何讓 Gemini 穩定回傳乾淨的 JSON 結果?
兩個關鍵:在 Prompt 中明確要求只回傳指定格式的 JSON、不要包含 Markdown 標記或其他文字;並在請求的 generationConfig 設定 responseMimeType 為 application/json 強制輸出 JSON。要注意 Gemini 回應的 JSON 結構很深,實際文字內容位於 candidates[0].content.parts[0].text,需再做一次 json_decode。
在 WordPress 串接 Gemini API 時,API Key 應該放在哪裡?
千萬不要把 API Key 直接寫死在程式碼裡。應在 wp-config.php 用 define 定義常數(例如 GEMINI_API_KEY)來存放,這是基本的資安做法。
如何避免同一筆客訴被重複分析而浪費 API 額度?
在處理函式中先檢查該筆資料是否已分析過,例如讀取 _is_analyzed 這個 post_meta,若已存在就直接返回。完成分析後再寫入該標記。同時也要排除文章修訂版本與自動存檔(用 wp_is_post_revision、wp_is_post_autosave 判斷),避免無限迴圈與重複扣額度。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

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

$
// final.exec()

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