0%

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

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

去除 WordPress 分類網址的 /category/:3 種做法與注意事項

iframe自動適應高度

WordPress 的分類網址預設長這樣:

https://example.com/category/news/

很多人會想拿掉中間的 category,變成:

https://example.com/news/

網址短一點、看起來也比較乾淨。這篇整理三種做法,但在動手之前,請先看完下一節:改網址不只是改網址。

改之前先想清楚

  • 對排名的影響很小:網址裡有沒有 category,主要差在好不好看、好不好記,不太會因此讓排名變好。
  • 所有分類網址都會改變:已經被 Google 收錄、被別人分享過的舊網址,都要 301 轉址到新網址,否則會變成 404 找不到網頁。
  • 可能跟頁面、文章的網址衝突:拿掉前綴後,分類 news 和頁面 news 的網址會一模一樣,其中一個會打不開(通常是分類蓋掉頁面)。
  • 以後要還原也很麻煩:移除外掛或程式碼,網址又會變回 /category/,要再轉址一次。

建議:新網站一開始就決定好網址結構;已經經營一段時間、分類頁有排名的網站,沒有明確需求的話,不一定要改。

做法一:換成別的前綴(最安全)

到「設定 → 固定網址」,頁面下方有一個可以自訂「分類」前綴的欄位。填入 topics,分類網址就會變成 /topics/news/。

  • 這個欄位留空,WordPress 會使用預設的 category,沒辦法用這裡直接拿掉前綴。
  • 網路上有教學說在欄位裡填一個「.」就能拿掉前綴,這不是 WordPress 正式支援的用法,分頁、子分類可能會出問題,不建議使用。

換成別的前綴,舊的 /category/ 網址一樣要轉址。Apache 或 LiteSpeed 主機可以在 .htaccess 的最上面(# BEGIN WordPress 之前)加上:

Apache (.htaccess)
RewriteEngine On
RewriteRule ^category/(.*)$ /topics/$1 [R=301,L]

.htaccess 的其他用法可以參考 .htaccess 用法大全。

做法二:用 SEO 外掛的選項(最簡單)

很多 SEO 外掛都內建「去除分類前綴」的選項,例如 Yoast SEO 的進階設定、Rank Math 的連結設定裡都找得到,打開開關就好,不用碰程式碼。

開啟之後,用瀏覽器輸入一個舊的 /category/… 網址測試,確認會自動轉到新網址;沒有的話,要用上面的 .htaccess 寫法或轉址外掛自己補上(把 /topics/$1 改成 /$1)。

做法三:用程式碼

不想為了這個功能裝外掛,可以用下面這段程式碼。它做了四件事:產生不含前綴的分類連結、為每個分類建立網址規則、把舊網址 301 轉到新網址、分類有變動時自動更新規則。

程式碼加在子主題的 functions.php,或用 Code Snippets 外掛新增(說明請看 WordPress functions.php 實用程式碼整理)。動手前先備份,最好先在測試站試過。

PHP
/**
 * 去除 WordPress 分類網址中的 /category/
 */

// 1) 產生分類連結時不加前綴
add_action( 'init', function () {
    global $wp_rewrite;
    if ( isset( $wp_rewrite->extra_permastructs['category'] ) ) {
        $wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
    }
} );

// 2) 為每個分類建立網址規則,並接住舊的 /category/ 網址
add_filter( 'category_rewrite_rules', function () {
    $rules = array();

    foreach ( get_categories( array( 'hide_empty' => false ) ) as $category ) {
        $path = $category->slug;
        if ( $category->parent ) {
            $parents = get_category_parents( $category->parent, false, '/', true );
            if ( ! is_wp_error( $parents ) ) {
                $path = $parents . $path;
            }
        }
        $path = urldecode( $path ); // 讓中文代稱也能對應

        $rules[ '(' . $path . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]';
        $rules[ '(' . $path . ')/page/?([0-9]{1,})/?$' ]                  = 'index.php?category_name=$matches[1]&paged=$matches[2]';
        $rules[ '(' . $path . ')/?$' ]                                    = 'index.php?category_name=$matches[1]';
    }

    $old_base = trim( get_option( 'category_base' ) ?: 'category', '/' );
    $rules[ $old_base . '/(.*)$' ] = 'index.php?ahwei_old_category=$matches[1]';

    return $rules;
} );

// 3) 舊網址 301 轉到新網址
add_filter( 'query_vars', function ( $vars ) {
    $vars[] = 'ahwei_old_category';
    return $vars;
} );

add_filter( 'request', function ( $query_vars ) {
    if ( isset( $query_vars['ahwei_old_category'] ) ) {
        $path = trim( $query_vars['ahwei_old_category'], '/' );
        wp_safe_redirect( home_url( user_trailingslashit( $path, 'category' ) ), 301 );
        exit;
    }
    return $query_vars;
} );

// 4) 新增、修改、刪除分類時,自動更新網址規則
foreach ( array( 'created_category', 'edited_category', 'delete_category' ) as $hook ) {
    add_action( $hook, function () {
        flush_rewrite_rules( false );
    } );
}

貼上之後的步驟

  1. 到「設定 → 固定網址」,不用改任何設定,直接按一次「儲存設定」,讓新的網址規則生效。
  2. 測試這幾種網址都正常:分類頁、分類的第 2 頁、子分類、分類的 RSS。
  3. 輸入舊的 /category/… 網址,確認會 301 轉到新網址。
  4. 以後新增、修改、刪除分類,程式會自動更新規則,不用再手動儲存。

幾個注意事項:

  • 固定網址不能是「預設」格式(?p=123 那種),要是「文章名稱」之類的格式才有作用。
  • 分類代稱建議用英文:中文代稱放進網址會變成一長串編碼(例如 %e6%96%b0%e8%81%9e),分享出去不好看。
  • 標籤網址不受影響:這段只處理分類,標籤還是 /tag/…。
  • 要移除這段程式碼:刪掉後同樣到固定網址按一次「儲存設定」,並把新網址轉回 /category/ 的網址。

這段程式是舊版文章程式碼的整理版:拿掉了支援十幾年前舊版 WordPress 的判斷,改用 wp_safe_redirect() 轉址,並加上錯誤檢查,在 PHP 8 上可以正常使用。

改完之後的檢查清單

  • 用轉址檢查工具確認是 301:在網路上搜尋「redirect checker」,輸入舊網址,應該看到 301,而且只轉一次就到新網址。
  • 檢查有沒有同名衝突:逐一看分類的代稱,有沒有跟頁面、文章的代稱一樣。有的話,改掉其中一個的代稱。
  • 更新內文裡的舊連結:選單裡的分類連結 WordPress 會自動更新;文章內文手動貼過的舊網址雖然會被轉址,還是建議把常用的幾處改成新網址。
  • 重新提交 Sitemap:網站地圖會自動換成新網址,到 Google Search Console 重新提交一次,做法請看 WordPress 網站地圖教學。

延伸閱讀

網址結構最好在建置網站時就規劃好,上線後再改,要處理的事情都會多很多。正威網路行銷是 25 年經驗的基隆網頁設計工作室,提供 SEO 搜尋引擎優化與網站維護託管,歡迎來聊聊。

分享這篇文章

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

發表留言

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

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