~/blog/wordpress-crm-spending-tier-content-generation.md
企業系統與 CRM · 2026 / 02 / 03

CRM 消費分級不只是報表:驅動 WordPress 自動化文案生成的技術實戰

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
CRM 消費分級不只是報表:驅動 WordPress 自動化文案生成的技術實戰
目錄 table-of-contents.md

在某個電商網站買了幾萬塊的設備,下次登入首頁,迎接我的卻還是那個「首購滿千折百」的彈窗。消費紀錄明明都在 CRM 裡,系統卻對熟客視而不見——罐頭訊息發得越勤,越是在提醒客戶:我根本不認識你。

這感覺就像你每個禮拜都去同一家高級牛排館吃飯,結果服務生每次都問你:「先生第一次來嗎?需要幫您介紹菜單嗎?」這不是禮貌,這是資料的傲慢。在 2026 年的今天,這種「一視同仁」的行銷方式,基本上就是在浪費流量,甚至是在趕客。

今天這篇文章不講虛無縹緲的行銷理論,我們要來點硬核的。我要教你如何利用 WordPress (WooCommerce) 結合 CRM 的消費數據,透過程式碼自動判斷使用者的「含金量」等級,並即時生成(而不只是替換)專屬於該等級的個人化文案。這才是真正的「千人千面」。

為什麼你的 VVIP 收到的是「新客優惠」?資料孤島的代價

很多企業都有 CRM (HubSpot, Salesforce) 也有 WordPress 官網,但這兩者通常是分居狀態。CRM 知道這個人是身價百萬的大戶,但 WordPress 只知道這是一個剛登入的 User ID 5566。

要解決這個問題,我們不需要重寫整個系統,只需要在 WordPress 的佈景主題 (Theme) 或客製化外掛中,建立一個「中間層邏輯」。這個邏輯負責做三件事:

  • 識別身份:確認目前瀏覽者是誰。
  • 撈取數據:從資料庫或 CRM API 獲取他的歷史消費總額 (LTV)。
  • 動態生成:根據等級,呼叫 AI 或使用預設邏輯,產出對應的文案。

第一步:從 WooCommerce 撈取「含金量」數據

首先,我們別把事情搞太複雜去 Call 外部 API(那會有延遲問題,影響 LCP)。最快的方法,是直接讀取 WooCommerce 的歷史訂單數據。在 2026 年,伺服器效能已經過剩,簡單的 SQL 查詢或內建函數這點負載根本是小菜一碟。

這段程式碼可以放在你的 functions.php 或者自製外掛中:


/**
 * 取得使用者的消費分級
 * 回傳: 'vip', 'regular', 'new', 'guest'
 */
function eric_get_user_tier( $user_id = 0 ) {
    if ( ! $user_id ) {
        $user_id = get_current_user_id();
    }

    // 如果沒登入,就是路人甲
    if ( 0 === $user_id ) {
        return 'guest';
    }

    // 使用 WooCommerce 內建函式取得總消費額
    // 這比自己寫 SQL Join 更安全且相容性更高
    $total_spent = wc_get_customer_total_spent( $user_id );

    // 這裡的門檻值建議寫在後台設定頁,方便行銷人員調整
    // 但為了 demo 方便,我先寫死 (Hard code)
    if ( $total_spent >= 50000 ) {
        return 'vip'; // 大戶
    } elseif ( $total_spent >= 5000 ) {
        return 'regular'; // 熟客
    } else {
        return 'new'; // 新手村
    }
}

這段 Code 很簡單,但卻是整個個人化引擎的心臟。有了它,我們就不再是盲目地推播內容了。

第二步:不只是 if/else,而是「動態文案引擎」

傳統的做法是寫一堆 if ($tier == 'vip') { echo '...'; }。這太無聊了,而且維護起來很痛苦。如果行銷團隊明天想把 VIP 的稱呼改成「尊榮黑卡會員」,你就得去改程式碼。

更進階的做法是,我們定義好不同等級的「Prompt Context(提示語境)」,然後讓文案自動組裝。在 2026 年,我們甚至可以串接本地端的輕量級 LLM (Large Language Model) 來即時潤飾語氣。

以下是一個不依賴外部 API,但具備高度彈性的實作架構:


function eric_generate_personalized_copy( $location_context = 'home_banner' ) {
    $tier = eric_get_user_tier();
    
    // 定義不同等級的文案策略
    $strategies = [
        'vip' => [
            'tone' => '尊榮、專屬、簡潔',
            'offer' => '專屬秘書服務',
            'greeting' => '歡迎回來,尊貴的會員',
        ],
        'regular' => [
            'tone' => '熱情、親切',
            'offer' => '老客戶 9 折回饋',
            'greeting' => '嗨!好久不見',
        ],
        'new' => [
            'tone' => '興奮、引導性強',
            'offer' => '首購免運',
            'greeting' => '歡迎加入我們',
        ],
        'guest' => [
            'tone' => '好奇、吸引',
            'offer' => '註冊領 100',
            'greeting' => '探索無限可能',
        ]
    ];

    $strategy = $strategies[$tier] ?? $strategies['guest'];

    // 這裡可以是一個簡單的字串替換,也可以是更複雜的 AI 生成邏輯
    // 為了效能,我們這裡示範模版替換法
    
    $copy_template = "
"; $copy_template .= "

{$strategy['greeting']}

"; $copy_template .= "

針對您的消費習慣,我們推薦:{$strategy['offer']}

"; $copy_template .= "
"; return $copy_template; }

進階:為什麼工程師要懂行銷?

你看上面的程式碼,重點不在於 PHP 怎麼寫,而在於那個 $strategies 陣列的設計。這就是工程師與行銷團隊的交集點。你可以把這個陣列做成一個 WordPress Option Page,讓行銷人員自己在後台填寫「尊榮感」的定義,而你只需要負責邏輯實現。

第三步:處理最棘手的「快取 (Cache)」問題

這是我一定要囉唆的地方。做個人化內容,最大的敵人不是程式邏輯,而是快取外掛 (Caching Plugins)

如果你的網站有用 WP Rocket、LiteSpeed Cache 或 Cloudways 的 Varnish,通常 HTML 會被快取起來。這會導致一個災難性的後果:A 客戶(VIP)登入後看到的頁面被快取了,結果 B 客戶(路人)進來,也看到了「歡迎回來,尊貴的會員」的畫面。這不僅尷尬,還可能洩漏資訊。

解決方案有兩種:

  1. AJAX 後載入: 頁面載入時先放一個 Placeholder (佔位符),然後用 JavaScript 發送 AJAX 請求,後端 PHP 判斷完身份後再回傳 HTML。這是最穩的做法。
  2. ESI (Edge Side Includes): 如果你用 LiteSpeed 或進階 CDN,可以用 ESI 標籤挖洞,讓那個區塊「不被快取」。

這裡提供一個簡單的 AJAX 前端實作概念 (jQuery 版本,因為 WordPress 內建):


// 前端 JS
jQuery(document).ready(function($) {
    if ($('#smart-banner-container').length) {
        $.ajax({
            url: localized_data.ajax_url,
            type: 'POST',
            data: {
                action: 'get_personalized_banner',
                security: localized_data.nonce
            },
            success: function(response) {
                if(response.success) {
                    $('#smart-banner-container').html(response.data);
                }
            }
        });
    }
});

2026 年的下一步:串接 Local LLM

現在手機和電腦的算力都很強,未來的趨勢不是每次都 Call OpenAI API (太貴且有隱私問題),而是透過 WebLLM 等技術,或者在伺服器端跑一個輕量模型。

你可以想像,當系統偵測到這個 VIP 客戶最近買了很多「露營用品」,我們不只是推播「露營燈」,而是由 AI 生成一段文案:「上次的露營還愉快嗎?為了您的下一次山林冒險,我們準備了更輕量化的帳篷...」。這種情境式 (Context-aware) 的推播,轉換率通常是罐頭訊息的 3 倍以上。

結論:別讓數據睡在資料庫裡

很多老闆會問:「Eric,做這個功能要花多久?」我會說,寫 Code 只要半天,但定義「什麼樣的客戶該看什麼樣的內容」需要你們行銷團隊動腦。

技術只是載體。透過 WordPress 強大的 Hook 機制與 WooCommerce 的數據底層,我們完全可以把一個死板的 CMS,改造成一個懂人心的 Sales Agent。別再讓你的 VIP 覺得自己跟路人沒兩樣了。

想了解更多關於如何將這些數據自動化應用到你的網站上?可以參考我們之前寫過的幾篇深度文章:

延伸閱讀

你的網站還在發送無效的罐頭行銷訊息嗎?

別浪費你的流量與會員數據。讓浪花科技幫你打造真正的「自動化個人行銷引擎」。

立即聯繫我們,啟動個人化行銷專案
// FAQ

常見問題

如何用 WooCommerce 判斷使用者的消費分級?
最快且相容性最高的方法是用 WooCommerce 內建函式 wc_get_customer_total_spent() 取得使用者歷史消費總額,再依門檻分級(例如總額達 50000 為 VIP、5000 以上為熟客、以下為新客,未登入則視為 guest)。這比自己寫 SQL Join 更安全,也避免呼叫外部 API 造成延遲影響 LCP。
為什麼個人化文案不該寫成一堆 if/else?
把文案寫死在 if ($tier == 'vip') 之類的判斷中維護困難,行銷團隊一旦想改稱呼就得改程式碼。較佳做法是把各等級的策略(語氣、優惠、招呼語)定義成陣列,讓文案自動組裝;更進一步可把這個陣列做成 WordPress 後台設定頁,讓行銷人員自行調整,工程師只負責邏輯實現。
做個人化內容時,快取(Cache)為什麼是最大的敵人?
若網站使用 WP Rocket、LiteSpeed Cache 或 Varnish 等快取,HTML 可能被整頁快取,導致 VIP 登入後產生的頁面被快取後,路人進來也看到「歡迎回來,尊貴的會員」,既尷尬又可能洩漏資訊。處理個人化區塊時必須繞過整頁快取。
如何避免個人化內容被整頁快取錯誤共用?
有兩種做法:一是 AJAX 後載入,頁面先放佔位符(Placeholder),再用 JavaScript 發送 AJAX 請求,由後端判斷身份後回傳對應 HTML,這是最穩的方式;二是若使用 LiteSpeed 或進階 CDN,可用 ESI(Edge Side Includes)標籤把該區塊挖洞,使其不被快取。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

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

$
// final.exec()

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