Google 讀不懂你的網站?工程師視角的 Schema 結構化資料完整實作教學 (JSON-LD 2026版)

2026/02/5 | WP 開發技巧, 企業 SEO 實作

工程師視角:手刻 JSON-LD 結構化資料,制霸 AI 時代的 SEO

時間來到 2026 年,如果你的 SEO 知識還停留在關鍵字堆砌,那就太落伍了!在 AI 生成式搜尋(SGE)主導的時代,讓 Google 真正理解你的網站內容,唯有仰賴工程師級的 Schema 結構化資料。我們不再滿足於外掛的 60 分通用解,本篇將帶你脫離舒適圈,直接用工程師最愛的 JSON-LD 格式,透過 WordPress 的 PHP Hooks 手把手實現 Article 和 BreadcrumbList 等複雜結構。立即掌握數據詮釋權,用精確的程式碼確保你的網站在競爭激烈的 AI 搜尋結果中脫穎而出!別讓技術限制了你的流量,這是你升級 SEO 架構的唯一機會。

需要專業協助?

聯絡浪花專案團隊 →

Google 讀不懂你的網站?工程師視角的 Schema 結構化資料完整實作教學 (JSON-LD 2026版)

嗨,我是 Eric。時間來到 2026 年,如果你還以為 SEO 只是在文章裡塞塞關鍵字(Keywords),那你真的該更新一下知識庫了。現在是 AI 生成式搜尋(SGE)與大型語言模型(LLM)主導的時代,Google 的爬蟲不再只是「讀取文字」,而是在「理解實體(Entities)」之間的關聯。

要讓搜尋引擎和 AI 機器人秒懂你的網站是在賣東西、發新聞還是提供服務,唯一的共通語言就是 Schema 結構化資料(Structured Data)。雖然市面上有一堆 SEO 外掛可以一鍵生成,但身為一名追求極致的工程師,我必須說:外掛產生的通用版 Schema,通常只達到了 60 分的及格線。

今天這篇文章,我們要脫離外掛的舒適圈,直接打開 functions.php,用工程師的視角,手把手教你如何用 PHP 與 JSON-LD 寫出最符合你網站需求的結構化資料。

為什麼 2026 年一定要用 JSON-LD?

在早期的網頁開發中,我們可能會用 Microdata(把標記直接寫在 HTML 標籤裡),那简直是維護地獄。只要前端改版,SEO 標籤就很容易跟著爛掉。

Google 官方早在多年前就強烈建議使用 JSON-LD (JavaScript Object Notation for Linked Data)。它的優點非常工程師友善:

  • 資料與視圖分離:它是一段獨立的 JavaScript 腳本,通常放在 <head><body> 結尾,完全不干擾 HTML 結構。
  • 巢狀結構清晰:可以輕鬆描述複雜的關係,例如「這篇文章」的「作者」是「這個人」,而「這個人」隸屬於「這間公司」。
  • 動態生成容易:在 WordPress 中,我們可以用 PHP 陣列(Array)構建資料,最後用 json_encode() 轉出,乾淨俐落。

實戰:在 WordPress 中手刻 Schema

我們不依賴外掛,而是使用 WordPress 的 Hook 機制,將腳本注入到頁面中。這需要你懂一點 PHP,但我保證這比除錯 CSS 簡單多了。

1. 基礎架構:掛載到 wp_head

首先,我們需要一個基本的函式,掛載到 wp_head Action 上。這樣可以確保我們的 JSON-LD 出現在 <head> 區域。

add_action('wp_head', 'roamer_add_schema_json_ld');

function roamer_add_schema_json_ld() {
    // 這裡將是我們構建 Schema 的地方
}

2. 文章(Article)Schema 實作

這是最常見的需求。我們要告訴 Google 這是一篇技術文章,包含標題、發布時間、作者與圖片。

function roamer_add_schema_json_ld() {
    // 只在單一文章頁面執行
    if ( !is_single() ) return;

    global $post;
    
    // 取得精選圖片 URL
    $thumbnail_src = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'full' );
    $image_url = $thumbnail_src ? $thumbnail_src[0] : '';

    // 構建陣列
    $schema = [
        '@context' => 'https://schema.org',
        '@type' => 'Article',
        'headline' => get_the_title(),
        'image' => [
            $image_url
        ],
        'datePublished' => get_the_date('c'), // ISO 8601 格式
        'dateModified' => get_the_modified_date('c'),
        'author' => [
            [
                '@type' => 'Person',
                'name' => get_the_author(),
                'url' => get_author_posts_url( get_the_author_meta( 'ID' ) )
            ]
        ],
        'publisher' => [
            '@type' => 'Organization',
            'name' => get_bloginfo('name'),
            'logo' => [
                '@type' => 'ImageObject',
                'url' => 'https://roamer-tech.com/path-to-your-logo.png'
            ]
        ]
    ];

    // 輸出 JSON-LD
    echo '<script type="application/ld+json">' . json_encode($schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT) . '</script>';
}

工程師的小囉嗦: 這裡有個重點,請務必使用 JSON_UNESCAPED_UNICODE,否則你的中文標題會變成一堆 \uXXXX 的亂碼,雖然機器讀得懂,但人類除錯時會看到脫窗。

3. 麵包屑(BreadcrumbList)Schema

麵包屑對於 SEO 結構至關重要,它能讓使用者在搜尋結果頁(SERP)看到層級關係。這段程式碼稍微複雜一點,因為要抓取分類。

// 在上面的函式中加入邏輯
$categories = get_the_category();
if ( !empty($categories) ) {
    $breadcrumb_list = [
        '@context' => 'https://schema.org',
        '@type' => 'BreadcrumbList',
        'itemListElement' => [
            [
                '@type' => 'ListItem',
                'position' => 1,
                'name' => '首頁',
                'item' => home_url()
            ]
        ]
    ];

    // 加入第一層分類
    $breadcrumb_list['itemListElement'][] = [
        '@type' => 'ListItem',
        'position' => 2,
        'name' => $categories[0]->name,
        'item' => get_category_link( $categories[0]->term_id )
    ];

    // 加入當前文章
    $breadcrumb_list['itemListElement'][] = [
        '@type' => 'ListItem',
        'position' => 3,
        'name' => get_the_title(),
        'item' => get_permalink()
    ];

    echo '<script type="application/ld+json">' . json_encode($breadcrumb_list, JSON_UNESCAPED_UNICODE) . '</script>';
}

4. 進階技巧:巢狀實體與 ID 參照

在 2026 年的 SEO 戰場,單純的 Schema 已經不夠看了。我們需要建立「關聯性」。例如,你可以將 ArticleProduct 關聯,或者在 FAQPage 中參照 Service

這時候,使用 @id 屬性就非常重要。透過定義全域唯一的 URI(例如 https://your-site.com/#identity),你可以在不同的 Schema 區塊中「指向」同一個實體,而不是重複定義。這能幫助 Google 的知識圖譜(Knowledge Graph)更精確地理解你的網站結構。

為什麼要自己寫?外掛做不到的事

這是我在浪花科技最常被客戶問到的問題:「Eric,裝個 Yoast SEO 不就好了嗎?」

沒錯,對於 80% 的部落格來說,外掛夠用了。但如果你的網站是:

  • 複雜的電商平台:需要根據庫存狀態動態改變 ItemAvailability
  • 活動報名網:需要整合 Event Schema 並且有複雜的票價邏輯。
  • 醫療或專業服務:需要符合 Google E-E-A-T 的嚴格標準,精確標記 MedicalSpecialtyPhysician

這時候,手寫 PHP 邏輯去生成 JSON-LD 才是唯一的解法。你可以利用 ACF (Advanced Custom Fields) 的欄位資料,直接灌入 Schema 中,這是任何通用型外掛都難以完美做到的。

驗證你的程式碼

寫完程式碼如果不驗證,跟寫完 Code 不寫 Test Case 一樣危險。請善用以下工具:

  • Google 豐富搜尋結果測試這是最權威的標準,直接告訴你 Google 認不認帳。
  • Schema.org Validator:用來檢查語法結構是否符合標準規範。

Eric 的總結

Schema 結構化資料是工程師與搜尋引擎溝通的橋樑。在 2026 年,這已經不是「加分項」,而是「基本功」。透過手動實作,你拿回了對資料詮釋權的完全控制。別讓外掛定義你的網站,你才是掌舵的人。

延伸閱讀

如果你想進一步優化你的 WordPress 架構,這裡有三篇我精選的技術文章:

需要客製化更複雜的 SEO 結構策略嗎?
別讓技術限制了你的流量。浪花科技隨時準備協助您。
立即聯繫我們

常見問題 (FAQ)

Q1: 使用 JSON-LD 會拖慢網站速度嗎?

幾乎不會。JSON-LD 只是純文字資料,瀏覽器在解析時不會像 CSS 或 JS 那樣阻塞渲染(Render Blocking)。加上 PHP 運算是在伺服器端完成,對前端效能的影響微乎其微。反而是安裝肥大的 SEO 外掛比較容易拖慢後台速度。

Q2: 如果我已經裝了 SEO 外掛,還可以手動加 Schema 嗎?

可以,但要小心重複。如果你手動寫了 Article Schema,記得去外掛設定裡把它的 Article Schema 功能關掉,否則 Google 會看到兩份資料,可能會導致判定混亂。建議是用手寫補足外掛做不到的部分(如進階的 Product 或 Service 關聯)。

Q3: Schema 寫好後多久會出現在 Google 上?

這取決於 Google 的爬蟲頻率。通常在通過驗證並提交 Sitemap 後,幾天到幾週內會有機會出現。但請注意,Schema 只是讓你有「資格」顯示豐富摘要(Rich Snippets),Google 不保證一定會顯示。