部落格(Blog)
Zensical 0.0.64 開始內建原生的 blog 外掛。你可以把部落格放在文件旁邊,也可以讓整個網站就是一個部落格。它會自動產生最新文章列表、封存頁、分類頁、作者頁與分頁。
需要 Zensical 0.0.64 以上
blog 是 2026-09-22 釋出的 0.0.64 才加入的功能。用 pip show zensical 或 uv pip show zensical 確認版本,需要時依 基本操作指令裡的「升級 Zensical」升級。
直接移植自 Material for MkDocs
Zensical 目前的部落格是 Material for MkDocs blog 外掛的原生移植,設定、文章中繼資料、網址、封存、分類、作者、分頁的行為都維持原樣,所以所有設定選項與文章欄位,都以 Material for MkDocs 的 blog 文件為準。官方表示之後會推出更適合 Zensical 的彈性部落格功能。
運作方式
Zensical 會掃描文章資料夾裡的 Markdown 檔案,產生分頁的「檢視頁」。預設的目錄結構如下:
blog/index.md是部落格的入口,會變成依時間倒序(新到舊)列出文章的分頁頁面。- 另外會自動產生封存頁、分類頁,以及(開啟時)作者頁。
- 文章可以放在巢狀資料夾,因為網址是由標題、日期與設定的網址格式產生,跟檔案放哪裡無關。
- 日期會依網站語言(
theme.language)顯示。 - 文章可以使用和其他頁面一樣的 Markdown 語法(提示框、程式區塊、頁簽、圖表……)。
啟用部落格
(在 mkdocs.yml 則是 plugins: 底下加上 - blog。)
已經在用 Material for MkDocs 的 blog 外掛的話,Zensical 同時認得 blog 與 material/blog 兩種寫法、預設的 blog/ 資料夾、.authors.yml 與既有的文章中繼資料,不必另外安裝任何套件。
導覽
- 自動產生導覽:什麼都不用設定,封存與分類頁會自動出現在導覽底下。
- 明確定義
nav:只加入部落格的入口頁,不要列出個別文章:
導覽項目的名稱可以任意取,例如「最新消息」或「技術文章」,但路徑必須和 blog_dir 一致。搭配 navigation.indexes(見 導覽設定)可以讓部落格區段直接使用 blog/index.md 當概覽頁。
寫第一篇文章
在 blog/posts/ 底下建立 Markdown 檔(可放在子資料夾)。每篇文章都必須有建立日期(沒有日期會讓建置失敗),其他中繼資料一樣寫在 Front matter:
---
date: 2026-09-22
categories:
- Hello
- World
---
# Hello world!
歡迎來到我們的新部落格。
- 草稿:加上
draft: true,文章在預覽(zensical serve)時會顯示,一般建置則預設不包含。準備發佈時,拿掉這行即可。 - 更新日期:日期可以同時記錄建立與更新:
啟動 zensical serve,就能在部落格、封存與分類頁看到這篇文章。
摘要(Excerpt)
部落格的列表頁可以只顯示摘要。在前幾段介紹文字之後加入分隔標記 <!-- more -->:
標記之前的內容就是摘要;沒有標記的話,列表頁會顯示整篇文章(除非設定 post_excerpt: required,此時沒有標記會直接報錯)。
作者
在部落格資料夾建立 .authors.yml,用一個固定的識別字定義每位作者:
authors:
jane:
name: Jane Doe
description: 技術作家
avatar: https://example.com/jane.png
每位作者可以設定 name、description、avatar、slug(作者頁網址)、url(個人網站)。文章裡用識別字引用,可以有多位作者;找不到對應作者時,建置會失敗:
分類
在文章加上一個或多個分類,就會出現在自動產生的分類頁:
分類名稱可以包含空白與中文(實測中文分類會產生 blog/category/教學/ 這樣的網址)。用 categories_allowed 限定可用分類,可以在建置時抓出打錯字:
文章使用了不在清單內的分類,建置會直接停止。
相關連結
links 會在文章側邊欄顯示相關連結,語法和 nav 相同,支援區段、外部網址與錨點:
---
date: 2026-09-22
links:
- 開始使用: zensical_basics.md
- 延伸閱讀:
- 官方網站: https://zensical.org
- 導覽設定: zensical_navigation.md
---
連結到文章與圖片
用文章的 Markdown 原始檔路徑連結,Zensical 會自動換成正確網址:
放在文章旁邊或底下的圖片等資源,會被搬到產生的部落格資源目錄,文章與摘要中的連結也會自動改寫。
文章的中繼資料
| 欄位 | 說明 |
|---|---|
date |
必填。文章日期;也可以用 created、updated 與自訂日期 |
draft |
true 時視為草稿 |
authors |
作者識別字清單(定義在 .authors.yml) |
categories |
分類清單 |
pin |
true 時置頂在列表最前面(多篇置頂時依日期新到舊排序) |
links |
側邊欄的相關連結 |
readtime |
手動指定閱讀時間(分鐘) |
slug |
自訂網址中的 slug |
中日韓文章的閱讀時間不準
自動計算的閱讀時間目前不會處理中日韓文字的斷詞,中文文章的估計會不準確。建議用 readtime 欄位手動指定。
常用的外掛設定
所有設定都放在 [project.plugins.blog]。下面是常用的選項與預設值:
[project.plugins.blog]
blog_dir = "blog" # 部落格所在資料夾("." 表示整站就是部落格)
post_dir = "{blog}/posts" # 文章資料夾
post_date_format = "long" # 文章日期格式:full / long / medium / short,或 babel 格式
post_url_format = "{date}/{slug}" # 文章網址格式
post_url_date_format = "yyyy/MM/dd" # 網址中的日期格式
post_excerpt = "optional" # 摘要:optional / required
post_readtime = true # 自動計算閱讀時間
archive = true # 產生封存頁
categories = true # 產生分類頁
authors = true # 讀取 .authors.yml 並顯示作者
authors_profiles = false # 產生作者個人頁
pagination_per_page = 10 # 每頁文章數
draft = false # 建置時是否包含草稿
draft_on_serve = true # 預覽時是否包含草稿
draft_if_future_date = false # 未來日期的文章視為草稿
| 想做的事 | 設定 |
|---|---|
| 整站就是部落格 | blog_dir = "." |
| 網址不含日期 | post_url_format = "{slug}" |
| 網址只含年份 | post_url_date_format = "yyyy" |
| 網址含分類 | post_url_format = "{categories}/{slug}",搭配 post_url_max_categories |
| 每頁顯示的文章數 | pagination_per_page = 5 |
| 分類頁/封存頁/作者頁的名稱與網址 | categories_name、categories_url_format、archive_name、archive_url_format、authors_profiles_name、authors_profiles_url_format |
| 限制摘要中顯示的作者/分類數 | post_excerpt_max_authors、post_excerpt_max_categories |
| 依文章數排序分類 | categories_sort_by、categories_sort_reverse |
| 列表頁用目錄顯示文章標題 | blog_toc = true(也可個別設定 archive_toc、categories_toc、authors_profiles_toc) |
| 未來日期的文章先不發佈 | draft_if_future_date = true,日期到了就自動發佈 |
更多選項
分頁格式(pagination_format)、分頁網址(pagination_url_format)、slug 的分隔字元(post_slugify_separator)等進階選項,請查 Material for MkDocs 的 blog 文件。
不支援的部分
自訂的 Python 函式(例如自己寫的 post_slugify、categories_sort_by)不被支援,只能使用內建的策略。從 Material for MkDocs 遷移時,如果用到自訂函式,請先檢查。
實測驗證
本頁的行為是在 Zensical 0.0.64 上實際建置驗證過的:
- 日期式文章網址(
blog/2026/09/01/hello-world/)、封存頁、分類頁(含中文分類)、作者頁與分頁都會產生。 draft: true與未來日期(搭配draft_if_future_date)的文章不會出現在一般建置。pin: true的文章會排在最前面。- 使用不在
categories_allowed的分類,或文章缺少date,建置都會失敗並指出檔案。 blog與material/blog兩種寫法都可以使用。
總結
| 步驟 | 做法 |
|---|---|
| 啟用 | [project.plugins.blog](需 Zensical 0.0.64+) |
| 入口頁 | docs/blog/index.md |
| 寫文章 | docs/blog/posts/*.md,front matter 必須有 date |
| 摘要 | <!-- more --> |
| 作者 | docs/blog/.authors.yml + authors: |
| 分類 | categories:,可用 categories_allowed 限制 |
| 草稿 | draft: true |
| 導覽 | 只加入 blog/index.md,不要列出文章 |