跳轉至

社群分享卡片(Social Cards)

Zensical 0.0.67 開始內建原生的 social 外掛,可以替每個頁面自動產生分享圖(social card),並補上對應的 Open Graph/Twitter Card 中繼標籤。連結被分享到 Slack、X(Twitter)、Facebook、LINE 等平台時,就會顯示漂亮的預覽圖,而不是空白或預設縮圖。

需要 Zensical 0.0.67 以上

social 是 2026-09-30 釋出的 0.0.67 才加入的功能。用 pip show zensical 或 uv pip show zensical 確認版本,需要時依 基本操作指令裡的「升級 Zensical」升級。

直接移植自 Material for MkDocs

和 部落格 一樣,social 外掛是 Material for MkDocs 的原生移植,設定選項與卡片版型沿用原本的設計。本頁涵蓋 Zensical 實際的建置行為;版型的進階客製化請參考 Material for MkDocs 的 social 外掛文件。

不要跟頁尾的「社交連結」搞混

[project.extra.social](見 設定頁尾)是頁尾/頁首的社交媒體圖示連結(GitHub、Facebook 等),和這裡的 [project.plugins.social](社群分享卡片)是完全不同的兩個功能,只是剛好都叫「social」。

最大的差異:不需要安裝 Cairo / Pillow

Material for MkDocs 的 social 外掛要產生卡片圖片,需要額外安裝 mkdocs-material[imaging](Pillow、CairoSVG),還要在系統上裝好 Cairo Graphics 函式庫,常常是新手卡關的地方。

Zensical 的 social 外掛是原生實作(Rust),產生圖片不需要任何額外的 Python 套件或系統函式庫,pip install zensical 或 uv add zensical 裝好就能直接用。本教學在完全沒裝 Pillow、CairoSVG 或 Cairo 函式庫的環境下,實際建置過啟用 social 的專案,卡片正常產生。

啟用

[project.plugins.social]

(在 mkdocs.yml 則是 plugins: 底下加上 - social。)

一定要設定 site_url

social 外掛要用 site_url 組出卡片圖片的完整網址,才能寫進 og:image。沒有設定 site_url 時,卡片依然會產生,但建置會印出警告,而且頁面不會寫入 og:image 等標籤:

WARNING -  The 'site_url' option is not set. Social cards are generated but not linked.

啟用後,zensical build 會替每一頁產生一張 1200 × 630 的 PNG,存放在 assets/images/social/<頁面路徑>.png(首頁是 index.png),並在該頁的 <head> 自動加入:

<meta property="og:type" content="website" />
<meta property="og:title" content="頁面標題 - 網站名稱" />
<meta property="og:image" content="https://your-site/assets/images/social/頁面路徑.png" />
<meta property="og:image:type" content="image/png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta property="og:url" content="https://your-site/頁面路徑/" />
<meta property="twitter:card" content="summary_large_image" />
<meta property="twitter:title" content="頁面標題 - 網站名稱" />
<meta property="twitter:image" content="https://your-site/assets/images/social/頁面路徑.png" />

og:title 與 twitter:title 的格式固定是「頁面標題 - 網站名稱」(首頁除外,首頁只用網站名稱),無法另外設定分隔字樣。

常用設定

[project.plugins.social]
enabled = true                  # 整個外掛的開關
cards = true                    # 是否產生卡片圖片
cards_dir = "assets/images/social"   # 卡片存放路徑(相對於 site_dir)
cards_layout = "default"        # 卡片版型
cards_layout_options = {}       # 版型參數,見下方
cards_include = []              # 只替符合的頁面產生卡片(留空=全部)
cards_exclude = []               # 排除符合的頁面
cache = true                    # 在多次建置之間快取卡片
cache_dir = ".cache/plugin/social"
想做的事 設定
關閉整個外掛 enabled = false
只關圖片、留 meta 標籤邏輯 cards = false
改卡片輸出路徑 cards_dir
只替某個子資料夾產生卡片 cards_include = ["blog/*"]
排除某些頁面 cards_exclude = ["changelog/*"]
停用快取(除錯用) cache = false

自訂卡片外觀

cards_layout_options 可以調整內建版型的顏色、字型、Logo、標題與說明文字,不需要自己刻版型。本教學網站實際使用的設定:

[project.plugins.social]
cards = true
cards_layout_options = { background_color = "#2b3d63", color = "#ffffff", font_family = "Noto Sans TC" }
選項 說明
background_color 背景色,支援 Hex、rgb()、hsl()、色彩名稱,也可以設成 transparent
background_image 背景圖片路徑(相對於專案根目錄),可與 background_color 疊加做色調處理
color 文字顏色
font_family 字型名稱,會自動從 Google Fonts 下載
font_variant 字型的變體(例如 Condensed)
logo 卡片上的 Logo,預設用 theme.logo 或 theme.icon.logo
title 覆寫卡片上顯示的標題文字(只影響卡片圖片,不會改變 og:title 這個 meta 標籤)
description 覆寫卡片上顯示的說明文字(同樣只影響圖片,不影響 og:description)

中文網站務必指定支援 CJK 的字型

font_family 如果用預設值或英文字型,中文標題在卡片上會印成一堆方塊(字型沒有對應的字符)。本教學用的是 Noto Sans TC(繁體中文),其他常見選擇還有 Noto Sans SC(簡體)。務必先確認字型支援你要顯示的文字。

在單一頁面覆寫

用 front matter 的 social 屬性,可以針對單一頁面覆寫卡片設定:

---
social:
  cards: false              # 這一頁不產生卡片,也不會輸出 og:image
---
---
social:
  cards_layout_options:
    background_color: "#ff1493"
    title: 自訂這張卡片上顯示的標題
---

把某個選項設成 null,可以重設回外掛的預設值。

自訂版型

想要完全自訂版型(例如加入特定的裝飾元素),可以在專案根目錄的 layouts/ 資料夾放版型檔案,再用 cards_layout 指定:

[project.plugins.social]
cards_layout = "my-custom-layout"
cards_layout_dir = "layouts"   # 預設就是 "layouts",可省略

建議把 layouts/ 放在 docs_dir 之外,這樣自訂版型不會被複製進最後產生的網站。版型檔案的撰寫方式請參考 Material for MkDocs 的版型文件。

常見狀況

如果你的專案已經有自己的 overrides/main.html 或 overrides/partials/seo.html 之類的覆寫,手動輸出了 og:title、og:type、og:url、og:image、twitter:* 等標籤,啟用 social 外掛之後,這些標籤會變成兩份,因為外掛會自動插入自己的一份,不會檢查頁面裡有沒有重複。

重複的 meta 標籤不是合法的 HTML,不同社群平台的爬蟲取第一個或最後一個標籤的行為也不一致,可能導致分享預覽時而正常、時而顯示錯的標題或沒有圖片。本教學網站就踩過這個坑:先前的 overrides/partials/seo.html 自己輸出一套 og:title/og:type/og:url,啟用 social 外掛後造成重複,已經把這幾個重複的標籤從自訂覆寫移除,只保留 social 外掛沒有處理的欄位(og:site_name、og:description、og:locale、twitter:description、JSON-LD 結構化資料)。

啟用 social 外掛前,請先檢查自己的覆寫檔案有沒有手動輸出下列標籤,有的話就移除,交給外掛處理:

  • og:type
  • og:title
  • og:url
  • og:image、og:image:type、og:image:width、og:image:height
  • twitter:card、twitter:title、twitter:image

卡片網址要在設定 site_url 之後才正確

卡片圖片本身一定會產生(不受 site_url 影響),但 og:image 這類需要完整網址的標籤,要有 site_url 才會輸出。本機預覽(zensical serve)如果沒設定 site_url,建置記錄裡會看到前面提到的警告,這是正常現象,不影響本機預覽,只要正式建置前確認 site_url 是正確的正式網址即可。

離線建置請關閉

和留言系統、程式庫連結一樣,social 外掛需要可對外的網址才有意義,離線使用(打包成下載檔案)時建議關閉。

實測驗證

本頁內容是在 Zensical 0.0.67、完全沒有安裝 Pillow/CairoSVG/Cairo 函式庫的環境下實際建置驗證:

  • 每頁都會產生對應的 1200 × 630 PNG,檔名與頁面路徑一致(首頁是 index.png)。
  • 沒有設定 site_url 時會印出警告,且頁面不含 og:image/twitter:image,但建置仍會成功、卡片仍會產生。
  • front matter 的 social.cards: false 可以讓單一頁面不產生卡片、不輸出對應 meta 標籤。
  • 自訂覆寫如果也輸出 og:title/og:type/og:url,會和外掛自動輸出的標籤重複(本教學網站的實際案例)。

總結

想做的事 做法
啟用 [project.plugins.social](需 Zensical 0.0.67+)
卡片能正確連結 設定 site_url
中文標題不要變方塊 cards_layout_options.font_family 用支援 CJK 的字型
調整顏色、Logo、文字 cards_layout_options
單頁覆寫或關閉 front matter 的 social:
避免重複的 OG/Twitter 標籤 檢查並移除自訂覆寫裡手動輸出的同名標籤
不想要圖片但想保留流程 cards = false

參考資料