0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

WordPress 文章目錄怎麼做?用程式碼依標題自動產生目錄

網頁設計技巧,為訪問者和特定角色啟用特定的CSS代碼

寫長篇教學或整理文時,在文章開頭放一份目錄,讀者一眼就知道這篇在講什麼,也能直接跳到想看的段落,不用一路往下滑。

做文章目錄有三種方式:

  • 用程式碼自動產生:每篇文章依照標題自動生成,不用多裝外掛。適合大部分文章都是長文的網站。
  • 用目錄外掛:想要浮動目錄、捲動時標示目前段落等進階功能時使用。
  • 區塊編輯器手動做:只有少數幾篇長文,手動做最簡單。

方法一:用程式碼自動產生目錄

原理是:在文章內容輸出之前,找出所有的 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 外掛已經附帶,不需要再裝一個。
  • 程式碼和外掛不要同時用,不然文章會出現兩份目錄。

方法三:區塊編輯器手動做目錄

只有幾篇長文章,手動做最簡單,也不會影響其他文章:

  1. 點選要列入目錄的「標題」區塊,在右側設定的「進階」裡找到「HTML 錨點」,填入一個英文名稱,例如 step-1。如果欄位已經有內容,可以直接用,或改成比較好記的名稱。
  2. 在文章開頭插入一個「清單」區塊,輸入每個段落的名稱。
  3. 選取清單裡的文字加上連結,網址填 #step-1(前面要加 #),就能跳到對應的標題。

缺點是標題改了,目錄要記得跟著改。

目錄寫得好,標題要先寫好

不管用哪一種方法,目錄都是從文章標題來的,所以:

  • 標題要看得出內容:「方法一」「注意事項」不如「用程式碼自動產生目錄」「改完沒效果的原因」清楚。
  • 層級不要亂跳:大段落用 h2,底下的小節才用 h3,不要為了字的大小亂選標題層級。
  • 清楚的標題結構,也讓搜尋引擎更容易理解文章在講什麼,寫法可以參考文章 SEO 的重點整理。

延伸閱讀

長文章好不好讀,排版和結構的影響跟內容一樣大。正威網路行銷是 25 年經驗的基隆網頁設計工作室,提供客製化網頁設計與 RWD 響應式網站,歡迎來聊聊。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

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

讓我們一起打造
您的專屬網站!