
寫長篇教學或整理文時,在文章開頭放一份目錄,讀者一眼就知道這篇在講什麼,也能直接跳到想看的段落,不用一路往下滑。
做文章目錄有三種方式:
- 用程式碼自動產生:每篇文章依照標題自動生成,不用多裝外掛。適合大部分文章都是長文的網站。
- 用目錄外掛:想要浮動目錄、捲動時標示目前段落等進階功能時使用。
- 區塊編輯器手動做:只有少數幾篇長文,手動做最簡單。
方法一:用程式碼自動產生目錄
原理是:在文章內容輸出之前,找出所有的 h2、h3 標題,幫沒有 id 的標題自動補上,再把這些標題組成一份目錄,放在第一個標題的前面。
程式碼加在子主題的 functions.php,或用 Code Snippets 外掛新增(說明請看 WordPress functions.php 實用程式碼整理):
PHP
add_filter( 'the_content', 'ahwei_post_toc', 20 );
function ahwei_post_toc( $content ) {
// 只在單篇文章的本文產生目錄
if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() || get_the_ID() !== get_queried_object_id() ) {
return $content;
}
$items = array();
$count = 0;
// 找出 h2、h3,沒有 id 的自動補上
$content = preg_replace_callback(
'/<h([23])([^>]*)>(.*?)<\/h\1>/is',
function ( $m ) use ( &$items, &$count ) {
$text = trim( wp_strip_all_tags( $m[3] ) );
if ( '' === $text ) {
return $m[0];
}
$attrs = $m[2];
if ( preg_match( '/\sid=["\']([^"\']+)["\']/i', $attrs, $found ) ) {
$id = $found[1];
} else {
$count++;
$id = 'toc-' . $count;
$attrs .= ' id="' . $id . '"';
}
$items[] = array(
'level' => (int) $m[1],
'id' => $id,
'text' => $text,
);
return '<h' . $m[1] . $attrs . '>' . $m[3] . '</h' . $m[1] . '>';
},
$content
);
// 標題少於 3 個就不顯示目錄
if ( count( $items ) < 3 ) {
return $content;
}
$toc = '<details class="post-toc" open><summary>文章目錄</summary><ul>';
foreach ( $items as $item ) {
$toc .= sprintf(
'<li class="toc-h%1$d"><a href="#%2$s">%3$s</a></li>',
$item['level'],
esc_attr( $item['id'] ),
esc_html( $item['text'] )
);
}
$toc .= '</ul></details>';
// 放在第一個標題前面
if ( preg_match( '/<h[23][\s>]/i', $content, $first, PREG_OFFSET_CAPTURE ) ) {
return substr_replace( $content, $toc, $first[0][1], 0 );
}
return $toc . $content;
}幾個重點:
- 標題少於 3 個不顯示:短文章不需要目錄,數字可以自己調整。
- 沿用已經設定的 id:在區塊編輯器幫標題設定過「HTML 錨點」的,會直接用你設定的名稱;沒有設定的,自動編成
toc-1、toc-2…… - 想改抓哪幾層標題:只要
h2,把程式碼裡兩處的[23]改成[2];要抓到h4,改成[234]。舊版教學只抓h2,道理相同。 - 可以收合:目錄用
details和summary標籤做成,讀者點「文章目錄」就能收合,不需要 JavaScript。想預設收合,把open拿掉。
目錄的樣式
在「外觀 → 自訂 → 額外 CSS」(區塊主題在「外觀 → 編輯器 → 樣式」的額外 CSS)加上:
CSS
.post-toc {
margin: 1.5em 0 2em;
padding: 1em 1.25em;
border: 1px solid #e2e2e2;
border-radius: 8px;
background: #fafafa;
}
.post-toc summary {
font-weight: bold;
cursor: pointer;
}
.post-toc ul {
margin: 0.75em 0 0;
padding-left: 1.2em;
}
.post-toc li {
margin: 0.3em 0;
}
.post-toc .toc-h3 {
margin-left: 1.2em;
font-size: 0.95em;
}
/* 點目錄時平滑捲動 */
html {
scroll-behavior: smooth;
}
@media (prefers-reduced-motion: reduce) {
html {
scroll-behavior: auto;
}
}
/* 網站上方有固定選單時,避免標題被選單擋住 */
h2[id],
h3[id] {
scroll-margin-top: 80px;
}scroll-behavior: smooth讓點目錄時慢慢捲到段落,而不是瞬間跳過去;對動畫敏感、在系統開啟「減少動態效果」的讀者,則維持直接跳轉。錨點的其他用法可以參考 html 連結錨點語法與慢慢滾動。scroll-margin-top的數字改成你網站固定選單的高度,標題才不會被擋住。- 舊版的樣式是把目錄浮動在文章右側、固定寬度,在手機上會把內文擠得很窄。現在建議直接放在內文上方、寬度自動,手機電腦都好讀。
方法二:用目錄外掛
不想碰程式碼,或想要更多功能,可以用外掛。到「外掛 → 安裝外掛」搜尋「Table of Contents」,例如 Easy Table of Contents 就是常見的選擇。這類外掛通常可以在設定頁選擇:
- 哪些文章類型要自動插入目錄
- 要抓哪幾層標題、標題少於幾個就不顯示
- 目錄的位置、外觀,以及能不能收合
挑選時注意幾件事:
- 選最近有更新、評價好、安裝數多的外掛。
- 先看主題本身有沒有內建目錄功能,有些主題或 SEO 外掛已經附帶,不需要再裝一個。
- 程式碼和外掛不要同時用,不然文章會出現兩份目錄。
方法三:區塊編輯器手動做目錄
只有幾篇長文章,手動做最簡單,也不會影響其他文章:
- 點選要列入目錄的「標題」區塊,在右側設定的「進階」裡找到「HTML 錨點」,填入一個英文名稱,例如
step-1。如果欄位已經有內容,可以直接用,或改成比較好記的名稱。 - 在文章開頭插入一個「清單」區塊,輸入每個段落的名稱。
- 選取清單裡的文字加上連結,網址填
#step-1(前面要加#),就能跳到對應的標題。
缺點是標題改了,目錄要記得跟著改。
目錄寫得好,標題要先寫好
不管用哪一種方法,目錄都是從文章標題來的,所以:
- 標題要看得出內容:「方法一」「注意事項」不如「用程式碼自動產生目錄」「改完沒效果的原因」清楚。
- 層級不要亂跳:大段落用
h2,底下的小節才用h3,不要為了字的大小亂選標題層級。 - 清楚的標題結構,也讓搜尋引擎更容易理解文章在講什麼,寫法可以參考文章 SEO 的重點整理。
延伸閱讀
- HTML 錨點連結教學:用 id 跳到指定位置、平滑捲動與固定頁首遮擋的解法
- WordPress 文章 SEO 怎麼做?標題、網址、內文、圖片與提交搜尋引擎的重點整理
- WordPress functions.php 實用程式碼整理:10 個常用又安全的小技巧
長文章好不好讀,排版和結構的影響跟內容一樣大。正威網路行銷是 25 年經驗的基隆網頁設計工作室,提供客製化網頁設計與 RWD 響應式網站,歡迎來聊聊。







發表留言
還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。