誰說 SEO 只是做白工?2026 WordPress 多渠道歸因實戰:用程式碼抓出那些被廣告搶功勞的訂單

2026/02/21 | WP 開發技巧, 企業 SEO 實作, 技術教學資源, 數位行銷策略

誰說 SEO 只是做白工?2026 WordPress 多渠道歸因實戰:用程式碼抓出那些被廣告搶功勞的訂單

大家好,我是浪花科技的 Eric。身為一個整天跟數據和程式碼搏鬥的資深工程師,我最怕聽到行銷主管跑來跟我說:「Eric 啊,我看這季的報表,SEO 帶來的轉換怎麼又是零?是不是我們該把預算全部砸去投 Meta 廣告算了?」

這時候,我通常會深吸一口氣,忍住翻白眼的衝動。為什麼?因為這是典型的「最後點擊(Last Click)」迷思。在 2026 年的今天,使用者的消費旅程複雜得像迷宮,如果你的 WordPress 網站還在依賴 GA4(或者現在的 GA5)預設的報表,那你看到的數據,很可能都是「廣告搶功勞」後的結果。

今天這篇文章不講虛的理論,Eric 要帶大家直接用 PHP 和 JavaScript 手刻一套「多渠道歸因(Multi-Channel Attribution)」追蹤系統。我們要抓出那個「第一次」——即便是廣告收割了訂單,我們也要知道,是誰先把客人帶進門的。

為什麼你的 SEO 總是「做白工」?

想像一個場景:

  • 第一天: 使用者小明想買人體工學椅,他在 Google 搜尋「2026 人體工學椅推薦」,點進了你精心撰寫的 SEO 文章。他看了很心動,但還在猶豫,於是關掉網頁。(功勞:SEO Organic)
  • 第三天: 你設定的 Meta 像素(Pixel)發揮作用,對小明投遞了「再行銷(Retargeting)」廣告。小明看到了,點擊廣告,還是沒買。(功勞:Paid Social)
  • 第五天: 小明終於領薪水了,他直接在瀏覽器輸入你的網址,下單購買。(功勞:Direct)

在傳統的「最後點擊」模型下,SEO 的功勞是零,因為最後一哩路不是它走的。但如果沒有第一天的 SEO 文章,小明根本不會進入你的再行銷名單。這就是為什麼我們需要「首次接觸歸因(First Touch Attribution)」,甚至是更完整的「線性歸因(Linear Attribution)」

在 2026 年,隨著 iOS 19 的隱私權更嚴格,以及瀏覽器全面封殺第三方 Cookie,依賴外部平台的數據越來越不準。最可靠的數據,永遠是我們自己伺服器端(Server-Side)抓到的第一手資料(First-Party Data)。

技術實戰:如何在 WordPress 抓取並儲存歸因數據

我們要做的邏輯很簡單:當使用者第一次進入網站時,檢查網址參數(UTM)或來源(Referer),把它存進 Cookie(設定長效期)。等到使用者結帳時,再把這個 Cookie 的值寫入 WooCommerce 的訂單資料(Order Meta)。

步驟一:設定首次來源 Cookie

我們需要在 `functions.php` 或者你自製的外掛中加入這段程式碼。這段 PHP 會在全站載入前執行,檢查是否有來源參數。


/**
 * 浪花科技 Eric 的碎碎念:
 * 這段程式碼負責捕捉使用者的「第一次」。
 * 如果 Cookie 已經存在,我們就不覆蓋它(First Touch 邏輯)。
 * 如果你想做 Last Touch,就把 !isset($_COOKIE...) 的判斷拿掉。
 */
add_action('init', 'roamer_set_source_cookie');

function roamer_set_source_cookie() {
    // 如果是後台或管理員,就不要浪費效能了
    if (is_admin() || current_user_can('manage_options')) {
        return;
    }

    $cookie_name = 'roamer_first_source';
    $cookie_time = time() + (86400 * 90); // Cookie 存活 90 天,這年頭使用者猶豫期很長的
    $cookie_domain = COOKIE_DOMAIN;

    // 檢查 Cookie 是否已存在(只抓首次來源)
    if (!isset($_COOKIE[$cookie_name])) {
        $source_data = [];

        // 1. 優先檢查 UTM 參數
        if (isset($_GET['utm_source'])) {
            $source_data = [
                'source' => sanitize_text_field($_GET['utm_source']),
                'medium' => isset($_GET['utm_medium']) ? sanitize_text_field($_GET['utm_medium']) : '',
                'campaign' => isset($_GET['utm_campaign']) ? sanitize_text_field($_GET['utm_campaign']) : '',
                'type' => 'utm'
            ];
        }
        // 2. 其次檢查 Google Click ID (GCLID) - 這代表是廣告來的
        elseif (isset($_GET['gclid'])) {
            $source_data = [
                'source' => 'google',
                'medium' => 'cpc',
                'campaign' => 'gclid_detected',
                'type' => 'gclid'
            ];
        }
        // 3. 最後檢查 HTTP Referer (自然流量 SEO 或其他外連)
        elseif (isset($_SERVER['HTTP_REFERER'])) {
            $referer = parse_url($_SERVER['HTTP_REFERER']);
            $host = $referer['host'] ?? '';

            // 排除自己的網域,不然會變成 Direct
            if ($host && strpos($host, $_SERVER['HTTP_HOST']) === false) {
                $medium = 'referral';
                // 簡單判斷搜尋引擎
                if (strpos($host, 'google') !== false || strpos($host, 'yahoo') !== false || strpos($host, 'bing') !== false) {
                    $medium = 'organic';
                }

                $source_data = [
                    'source' => $host,
                    'medium' => $medium,
                    'campaign' => '',
                    'type' => 'referer'
                ];
            }
        }

        // 如果抓到了資料,就寫入 Cookie
        if (!empty($source_data)) {
            $json_data = json_encode($source_data);
            // 2026 年資安很重要,記得設定 HTTPOnly 和 Secure
            setcookie($cookie_name, $json_data, $cookie_time, '/', $cookie_domain, true, true);
            
            // 為了讓 JS 也能讀取 (如果需要),可以設另一個非 HTTPOnly 的 Cookie,但這邊我們先只做後端處理
        }
    }
}

步驟二:在 WooCommerce 結帳時儲存數據

捕捉到來源後,重點是要把它跟「錢」綁在一起。當使用者下單時,我們把 Cookie 裡的資料抓出來,存進這筆訂單的 Meta Data。


/**
 * 結帳時將歸因數據寫入訂單
 */
add_action('woocommerce_checkout_update_order_meta', 'roamer_save_source_to_order');

function roamer_save_source_to_order($order_id) {
    $cookie_name = 'roamer_first_source';

    if (isset($_COOKIE[$cookie_name])) {
        // 解碼 JSON
        $source_data = json_decode(stripslashes($_COOKIE[$cookie_name]), true);

        if ($source_data) {
            // 儲存為訂單 Meta,方便後續撈取或傳給 CRM
            update_post_meta($order_id, '_roamer_attribution_source', $source_data['source']);
            update_post_meta($order_id, '_roamer_attribution_medium', $source_data['medium']);
            update_post_meta($order_id, '_roamer_attribution_campaign', $source_data['campaign']);
            
            // 我個人喜歡加一個標籤,方便後台一眼看到
            $note = sprintf(
                '【歸因分析】首次來源: %s | 媒介: %s | 活動: %s',
                $source_data['source'],
                $source_data['medium'],
                $source_data['campaign']
            );
            
            // 加到訂單備註,給業務或行銷看
            $order = wc_get_order($order_id);
            $order->add_order_note($note);
            $order->save();
        }
    } else {
        // 如果沒有 Cookie,通常就是 Direct 或者我們追蹤不到的「暗網流量」
        update_post_meta($order_id, '_roamer_attribution_source', 'direct');
        update_post_meta($order_id, '_roamer_attribution_medium', 'none');
    }
}

數據視覺化:別讓數據躺在資料庫睡覺

實作完上述程式碼後,當有新訂單進來,你的 WooCommerce 訂單備註區就會出現類似這樣的文字:

【歸因分析】首次來源: google.com | 媒介: organic | 活動:

這時候,真相就大白了。即便 GA4 告訴你這筆訂單是來自 Facebook CPC(因為那是最後點擊),你的後台備註會誠實地告訴你:「嘿,別忘了,這傢伙 30 天前是因為搜尋了我們的 SEO 文章才認識我們的!」

進階玩法:傳送給 CRM 或 Google Sheets

身為資深工程師,Eric 建議不要只把數據留在 WordPress。你可以透過 Webhook 或是像 n8n 自動化工具,將這些 _roamer_attribution_source 欄位傳送到你的 CRM(如 HubSpot, Salesforce)或 Google Sheets。這樣你就能算出真正的 ROI:

  • SEO 貢獻營收: 加總所有 medium = organic 的訂單金額(即使 GA 說是 Direct)。
  • 廣告真實 ROAS: 比較廣告後台的 ROAS 與你的歸因數據,你會發現很多廣告其實是在「收割」SEO 的流量。

2026 年的隱私挑戰與應對

我知道有些比較技術流的朋友會問:「Eric,現在瀏覽器都在擋 Cookie,這樣做準嗎?」

老實說,沒有 100% 準確的歸因,只有「相對準確」。我們上面使用的是 First-Party Cookie(第一方 Cookie),是你的網域自己發給使用者的,目前為止,Safari 的 ITP (Intelligent Tracking Prevention) 對第一方 Cookie 的限制主要是縮短效期(例如 7 天),但如果你有 Server-Side GTM 配置,或者像我們上面這樣用 PHP (Server-Side) 設定 Cookie,存活率會比純 JavaScript 設定的高很多。

此外,2026 年 Google 推出的 Topics API 和隱私沙盒(Privacy Sandbox)已經改變了廣告追蹤的生態,但「第一方數據」的所有權永遠在你自己手上。這也是為什麼我們浪花科技一直強調企業要建立自己的數據護城河,不要過度依賴外部平台報表的原因。

結論:還 SEO 一個公道

多渠道歸因分析不只是為了幫 SEO 團隊「爭功勞」,更重要的是讓老闆看清預算的真實流向。當你發現 30% 的廣告轉換其實源自於半年前的一篇部落格文章時,你對內容行銷的投資策略就會完全改變。

別再當盲目的行銷人了,用程式碼把真相抓出來吧!

推薦閱讀

覺得程式碼太複雜,或者是數據對不起來讓你頭很痛?這很正常,因為從 2026 年開始,追蹤技術已經變成純工程師的戰場了。如果你需要一個專業團隊幫你架構完整的企業級歸因系統,歡迎聯繫浪花科技,讓 Eric 和我們的團隊來幫你解決技術債!

立即諮詢浪花科技

常見問題 (FAQ)

Q1: 為什麼 GA4 的數據跟後台訂單的歸因數據對不上?

這非常正常。GA4 預設使用的是「以數據為準(Data-driven)」或「最後點擊(Last Click)」模型,且受限於使用者的 Cookie 同意與瀏覽器隱私設定。我們用 PHP 抓取的是伺服器端的第一方數據,能夠捕捉到一些 GA4 漏失或被過濾掉的原始來源,通常後端數據會比前端分析工具更接近真實情況。

Q2: 如果使用者用手機看文章,回家用電腦下單,這套程式碼抓得到嗎?

這是一個好問題。這段純 Cookie 的程式碼無法解決「跨裝置(Cross-Device)」的問題。要解決這個問題,你需要引入「User ID」追蹤,也就是鼓勵使用者登入會員。當使用者在手機登入看文章,然後在電腦登入購買,我們可以透過會員 ID 將這兩個 session 串接起來。這需要更進階的 CRM 整合開發。

Q3: 這段程式碼會拖慢網站速度嗎?

幾乎不會。這段 PHP 邏輯非常輕量,只是簡單的參數檢查和 Cookie 設定,不像外部的 JavaScript 追蹤碼(如 Pixel 或 GTM)需要下載額外的檔案並在瀏覽器執行。在伺服器端處理歸因,反而是 2026 年網站效能優化的最佳實踐之一。