
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 之前)加上:
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 實用程式碼整理)。動手前先備份,最好先在測試站試過。
/**
* 去除 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 );
} );
}貼上之後的步驟
- 到「設定 → 固定網址」,不用改任何設定,直接按一次「儲存設定」,讓新的網址規則生效。
- 測試這幾種網址都正常:分類頁、分類的第 2 頁、子分類、分類的 RSS。
- 輸入舊的
/category/…網址,確認會 301 轉到新網址。 - 以後新增、修改、刪除分類,程式會自動更新規則,不用再手動儲存。
幾個注意事項:
- 固定網址不能是「預設」格式(
?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 網站地圖教學。
延伸閱讀
- 網頁轉址與自動重新整理語法整理:301 轉址、meta refresh、JavaScript(WordPress 適用)
- .htaccess 用法大全:轉址、HTTPS、安全防護、壓縮與快取常用設定(WordPress 適用)
- WordPress 網站地圖(XML Sitemap)怎麼做?內建功能、SEO 外掛與提交 Google 教學
網址結構最好在建置網站時就規劃好,上線後再改,要處理的事情都會多很多。正威網路行銷是 25 年經驗的基隆網頁設計工作室,提供 SEO 搜尋引擎優化與網站維護託管,歡迎來聊聊。







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