導讀:其實網上很多去掉分類標誌的方法,比如固定連結前加一個小點.,亦或者是修改 WordPress 原程式檔案的方法,感覺最好用的就是使用外掛:no-cat...

其實網上很多去掉分類標誌的方法,比如固定連結前加一個小點 「.」,亦或者是修改 WordPress 原程式檔案的方法,感覺最好用的就是使用外掛:no-category-base,使用改外掛,不僅能將 category 標誌去掉,而且訪問之前帶 category 的分類目錄還有做 301 跳轉,這非常利於 SEO 。不管怎麼說,如果你能看到這篇文章,那麼就是隻想實現這個功能,並且不想用外掛,引用奶嘴大大的一句話,我相信大家看完就能明白:

  其實在 WordPress 裡,不管你有沒有啟用外掛和主題,只要你把它們上傳 WordPress 裡了,WordPress 就會在後他把那些外掛和主題的資訊讀取出來再顯示。那麼這樣的話 WordPress 每讀取一個外掛的資訊就要歷遍一次檔案 (PS:因為 WordPress 外掛沒有固定的資訊存放檔案,只要外掛作者高興,外掛目錄下的任意一個 php 檔案都是可以的。所以 WordPress 只能透過歷遍檔案來讀取資訊。),而主題資訊呢?都在 style.css 裡,也就是說每個主題存在於伺服器上的主題 WordPress 都會把他們的 style.css 讀取一遍,那麼數量多的話 WordPress 的速度也就慢下來了,所以小 V 建議主題和外掛能不用的都不用並且刪除掉。外掛能整合到主題的儘量整合到主題,因為這樣就可以減少 WordPress 歷遍檔案的次數了。

  如果你認真看完了上面一篇文章,你就能明白,為何會有這篇文章了,哈哈。廢話不多說,我們的目的就是移植外掛 no-category-base 到主題的 functions.php 中。

  如何移植外掛?

  恩,這是個問題,如果你也是隻是想得到結果的伸手黨,好吧,跳轉到文章最後面複製程式碼貼上到你的 functions.php 中就可以了,接下來說說外掛移植到 functions.php 中的注意事項,注意,因為本人也是 wp 折騰菜鳥,所有有錯的地方,望大神指出來:

  其實最主要的就是這個 register_activation_hook, 這個是外掛註冊的時候啟用,所以直接丟到 functions.php 裡肯定會出錯,丟到主題中,我們就將此處修改為主題啟用的時候啟用,那麼相應的就為 load-themes.php,好了重點完了。接下來直接看程式碼,我相信大家就會明白了。

去除分類標準 category 程式碼版

  註釋的地方就是外掛停用的時候移出偽靜態規則,這裡我們不需要他,因為主題未啟用就相當於沒有啟用這個偽靜態規則,語文不好,表述不清。你懂得。將下面的程式碼複製到你主題的 functions.php 中即可去掉分類標誌:

/* 
*去除分類標誌程式碼, 來自 WordPress 主題
*/
add_action( 'load-themes.php',  'no_category_base_refresh_rules');  
add_action('created_category', 'no_category_base_refresh_rules');  
add_action('edited_category', 'no_category_base_refresh_rules');  
add_action('delete_category', 'no_category_base_refresh_rules');  
function no_category_base_refresh_rules() {      
global $wp_rewrite;  
$wp_rewrite -> flush_rules();  
}  
// register_deactivation_hook(__FILE__, 'no_category_base_deactivate');  
// function no_category_base_deactivate() {  
//  remove_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');  
//  // We don't want to insert our custom rules again  
//  no_category_base_refresh_rules();  
// }  
// Remove category base  
add_action('init', 'no_category_base_permastruct');  
function no_category_base_permastruct() {  
global $wp_rewrite, $wp_version;  
if (version_compare($wp_version, '3.4', '<')) {  
// For pre-3.4 support  
$wp_rewrite -> extra_permastructs['category'][0] = '%category%';  
} else {  
$wp_rewrite -> extra_permastructs['category']['struct'] = '%category%';  
}  
}  
// Add our custom category rewrite rules  
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');  
function no_category_base_rewrite_rules($category_rewrite) {  
//var_dump($category_rewrite); // For Debugging  
$category_rewrite = array();  
$categories = get_categories(array('hide_empty' => false));  
foreach ($categories as $category) {  
$category_nicename = $category -> slug;  
if ($category -> parent == $category -> cat_ID)// recursive recursion  
$category -> parent = 0;  
elseif ($category -> parent != 0)  
$category_nicename = get_category_parents($category -> parent, false, '/', true) . $category_nicename;  
$category_rewrite['(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';  
$category_rewrite['(' . $category_nicename . ')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';  
$category_rewrite['(' . $category_nicename . ')/?$'] = 'index.php?category_name=$matches[1]';  
}  
// Redirect support from Old Category Base  
global $wp_rewrite;  
$old_category_base = get_option('category_base') ? get_option('category_base') : 'category';  
$old_category_base = trim($old_category_base, '/');  
$category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';  
//var_dump($category_rewrite); // For Debugging  
return $category_rewrite;  
}  
// Add 'category_redirect' query variable  
add_filter('query_vars', 'no_category_base_query_vars');  
function no_category_base_query_vars($public_query_vars) {  
$public_query_vars[] = 'category_redirect';  
return $public_query_vars;  
}  
// Redirect if 'category_redirect' is set  
add_filter('request', 'no_category_base_request');  
function no_category_base_request($query_vars) {  
//print_r($query_vars); // For Debugging  
if (isset($query_vars['category_redirect'])) {  
$catlink = trailingslashit(get_option('home')) . user_trailingslashit($query_vars['category_redirect'], 'category');  
status_header(301);  
header("Location: $catlink");  
exit();  
}  
return $query_vars;  
}