社群分享卡片(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 的專案,卡片正常產生。
啟用
(在 mkdocs.yml 則是 plugins: 底下加上 - social。)
一定要設定 site_url
social 外掛要用 site_url 組出卡片圖片的完整網址,才能寫進 og:image。沒有設定 site_url 時,卡片依然會產生,但建置會印出警告,而且頁面不會寫入 og:image 等標籤:
啟用後,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 屬性,可以針對單一頁面覆寫卡片設定:
把某個選項設成 null,可以重設回外掛的預設值。
自訂版型
想要完全自訂版型(例如加入特定的裝飾元素),可以在專案根目錄的 layouts/ 資料夾放版型檔案,再用 cards_layout 指定:
[project.plugins.social]
cards_layout = "my-custom-layout"
cards_layout_dir = "layouts" # 預設就是 "layouts",可省略
建議把 layouts/ 放在 docs_dir 之外,這樣自訂版型不會被複製進最後產生的網站。版型檔案的撰寫方式請參考 Material for MkDocs 的版型文件。
常見狀況
和自訂的 <head> 覆寫衝突
如果你的專案已經有自己的 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:typeog:titleog:urlog:image、og:image:type、og:image:width、og:image:heighttwitter: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 × 630PNG,檔名與頁面路徑一致(首頁是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 |