WordPress默認生成的分類目錄 URL 中是帶 category 的,比如我愛水煮魚的 WordPress 的分類目錄的 URL?https://blog.wpjam.com/category/wordpress/
?就帶了 category。那么如何去掉呢?
- 原文來源:詳情
方式一:使用插件
網上有很多相關的 WordPress 插件,都可以解決這個問題,不過大部分插件都是把所有的分類都寫入 WordPress 的 rewrite 規則,這樣會造成 rewrite 規則會非常臃腫,反而會使得 WordPress 變慢。
方式二:設置分類目錄前綴
另外 WordPress 還有一個非常方便的方法,可以說是最簡化去掉分類目錄 URL 中的 category。只需要在 WordPress 后臺,點擊「設置」菜單下的「固定鏈接」子菜單,將「分類目錄前綴」設置為?.
?就可以:
英文輸入法下的“句號”:半角逗號


方式三:代碼版(老手推薦)
如果仔細觀察一下去掉 category 的分類目錄 url:https://blog.wpjam.com/wordpress/
,是不是和 WordPress 的頁面規則是一樣的,比如我愛水煮魚的關于頁面:https://blog.wpjam.com/about/
,那么我們可以使用頁面的 rewrite 規則來處理。
當 WordPress 進入頁面 rewrite 規則的時候,我們判斷一下,當前的?pagename
?是不是某個分類的 slug,如果是,就把當前的?query_var
?中的?pagename
?換成?category_name
,這樣就可以實現了。
將以下代碼添加至主題根目錄下的functions.php
文件的<?php
下保存即可。
add_filter('request', function($query_vars) {
if(!isset($_GET['page_id']) && !isset($_GET['pagename']) && !empty($query_vars['pagename'])){
$pagename = $query_vars['pagename'];
$categories = get_categories(['hide_empty'=>false]);
$categories = wp_list_pluck($categories, 'slug');
if(in_array($pagename, $categories)){
$query_vars['category_name'] = $query_vars['pagename'];
unset($query_vars['pagename']);
}
}
return $query_vars;
});
add_filter('pre_term_link', function($term_link, $term){
if($term->taxonomy == 'category'){
return '%category%';
}
return $term_link;
}, 10, 2);
?