內容目錄連結是 toc_1,正文卻沒有可以跳的目標
整理日期:2026-08-10
一篇知識庫文章的內容目錄看起來正常,連結也依序產生了:
<a href="#toc_1">第一個章節</a><a href="#toc_2">第二個章節</a>點擊後,網址會出現 #toc_1,頁面卻沒有移動到第一個標題。
這種狀況很容易先懷疑平滑捲動、固定頁首或 offset。但檢查正文 DOM 後,頁面裡根本沒有 id="toc_1"。
事情怎麼變成這樣
Section titled “事情怎麼變成這樣”網站原本為了把目錄放在自訂文章版型的指定位置,另外做了一層目錄 wrapper。這層程式可以叫出 Easy Table of Contents 的目錄清單,但正文仍由原本的文章模板輸出。
後來又加上一段 filter。只要外掛產生的 anchor 含有 %,就把它改成 toc_1、toc_2 這類流水號,想讓中文標題的網址短一點。
兩段程式各自都能執行,合在一起卻少了一半:
- 自訂 wrapper 產生了
href="#toc_1"。 - 正文沒有套用 Easy TOC 加入錨點的內容結果。
- 最後只有連結,沒有目標。
瀏覽器不是不會捲動,而是找不到要捲到哪裡。
先拆成幾層看
Section titled “先拆成幾層看”- 查看每個
.ez-toc-link的href。 - 在同一頁搜尋完全相同的
id。 - 確認正文是否經過 WordPress 標準的
the_content()filter。 - 確認自訂 wrapper 是否只產生目錄,沒有使用外掛處理後的正文。
- 暫時停用自訂 anchor filter,查看外掛原生輸出是否恢復一致。
只看網址後面有沒有 #ID 不夠。有效的錨點至少要同時具備:
href="#同一個值" → 頁面內剛好有一個 id="同一個值"Easy TOC 原本會掃描文章的 H1 到 H6,產生目錄連結,再把相同 anchor 寫進正文標題附近的 <span>。
中文標題產生的 fragment 看起來可能是一長串百分比編碼,但那不是錯誤。只要目錄的 href 和正文的 id 相同,瀏覽器就能正常跳轉。
現有程式用 strpos($return, '%') 判斷中文也不可靠。Emoji、全形標點、其他非 ASCII 語言與部分特殊字元,網址編碼後同樣會出現 %。
toc_1 不是備援機制。它只是另一套命名方式,而且章節重排後,原本的 toc_1 可能改指完全不同的內容。
這次的根本原因是:目錄與正文沒有使用同一次 Easy TOC 處理結果。
優先使用外掛原生流程:
- 在 Easy TOC 設定中啟用該自訂文章類型。
- 讓文章模板使用標準
the_content()輸出正文。 - 使用外掛的自動插入功能產生目錄與正文錨點。
- 停用只負責輸出目錄清單的自訂 wrapper。
- 移除「看到
%就改成toc_1」的分支。
沒有手動 ID 時,filter 應直接保留外掛原本產生的 $return:
add_filter('eztoc_url_anchor_target', function ($return, $heading) { return $return;}, 10, 2);如果版面限制讓自訂 wrapper 一定要保留,就不能只取得目錄 HTML。wrapper 必須同時輸出同一次 heading extraction 處理後的正文,讓目錄與正文共用同一份 anchor mapping。
這條路需要維護更多程式與快取失效邏輯,只有原生自動插入無法滿足版面時才值得做。
手動 ID 還有一個陷阱
Section titled “手動 ID 還有一個陷阱”標題如果已經是:
<h2 id="manual-anchor">章節標題</h2>又讓外掛在裡面加入同名 <span id="manual-anchor">,同一頁就會出現兩個相同 ID。
要保留手動 ID,可以讓 H 標籤本身成為唯一目標,或把 ID 交給外掛產生的 span。不要兩邊都留。
不建議先做的事
Section titled “不建議先做的事”- 不要看到中文百分比編碼,就先全部改成
toc_1。 - 不要只修目錄
href,卻沒有檢查正文目標。 - 不要用 CSS 或 scroll offset 修一個根本不存在的 ID。
- 不要讓目錄與正文分別建立兩套流水號。
- 不要在 H 標籤和內層 span 留下重複 ID。
下次遇到可以先整理什麼
Section titled “下次遇到可以先整理什麼”- 目錄第一個連結的完整
href。 - 正文是否存在完全相同的
id。 - 文章模板是否使用
the_content()。 - 目錄是外掛自動插入,還是自訂 wrapper 額外輸出。
- 自訂文章類型是否在外掛設定中啟用。
- 是否有修改
eztoc_url_anchor_target的 filter。 - 相同標題、中文標題、英文標題與手動 ID 是否都能通過。
WordPressEasy Table of Contents內容目錄錨點the_content自訂文章類型