WordPress默认文章分类路径是自带 /category/目录的,而文章详情页面并没有带 /category/。很多有技术洁癖的用户就非常希望把分类目录URL中的/category/去掉。这里,我们WPPOP为大家提供了几种常用的方法,我们可以使用第三方插件或者添加代码的方法来实现去掉URL中的/category/的目的。
其实,对于搜索优化要求来说,网站URL路径越简洁、越简短越好,理论上说搜索引擎认为 http://www.domain.com/category/cat-name
的权重不如 http://www.domain.com/category/cat-name
的权重高,搜索蜘蛛访问的时候抓取后者速度要更快,所以去除URL中的/category/的也是有道理的。实际上,随着近年来搜索引擎技术的不断发展进化,只要你的网页路径保持个3~4层级,一般对应搜索蜘蛛抓取都没有影响的。当然,在首选遵循URL路径越简洁、越简短越好的规则,我们认为去掉URL中的/category/的效果会更好。
方法1:No Category Base (WPML) – WordPress插件
No Category Base (WPML) 是一款帮助您完全强制性删除URL中/category/的插件(例如,’mysite.com/category/cat-name/’ 去掉后是 ‘mysite.com/cat-name/’)。该插件不需要设置或修改WordPress核心文件,也不会破坏任何链接。它还会将您的旧类别链接重定向到新类别链接。
插件特色:
- 更好更合理的永久链接,’mysite.com/category/cat-name/’ 去掉后是 ‘mysite.com/cat-name/’;
- 简单的插件 – 几乎不增加任何开销;
- 启用即可,无需额外设置;
- 无需修改WordPress文件;
- 不需要其他插件配合工作;
- 与站点地图插件兼容;
- 兼容WPML;
- 适用于多个子类别;
- 适用于WordPress Multisite 多站点;
- 将旧类别永久链接重定向到新类别(301重定向,适用于SEO)。
此外,类似插件还有 Remove Category URL 和 FV Top Level Categories。使用插件的好处就是都不需要额外的设置和代码修改;只要安装启用插件就可以实现去掉URL中/category/的目的了。
方法2:永久链接中删除/category/
1. 在网站后台找到 设置 > 固定连接(Settings > Permalinks) 设置页面,如下图所示:
2. 在 自定义结构(Custom Structure)项,设置固定连接结构为: /%category%/%postname%/
;
3. 接下来,在 分类目录前缀(Category base)项设置为 .
(英文句号);
4. 保存后即可生效。
方法3:在 .htaccess 中添加指令删除/category/
在你的网站根目录找到 .htaccess 文件,并在里面添加一行代码:
RewriteRule ^category/(.+)$ https://www.wppop.com/$1 [R=301,L]
提示:修改里面的 https://www.wppop.com/ 为你的域名即可。
方法4:添加代码到主题的 functions.php 文件
添加下面的代码到当前使用的主题 functions.php 文件中:
// 去除 category 代码
if( _hui(‘no_categoty’) && !function_exists(‘no_category_base_refresh_rules’) ){
register_activation_hook(__FILE__, ‘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();
}
// 移除 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;
}
// For Debugging
//add_filter(‘rewrite_rules_array’, ‘no_category_base_rewrite_rules_array’);
//function no_category_base_rewrite_rules_array($category_rewrite) {
// var_dump($category_rewrite); // For Debugging
//}
// 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;
}
}
添加以上代码后就可以自动去除URL中的 /category/目录了,这段代码内容其实就是 WP No category Base 插件的主要代码,所以不安装这个插件,添加该代码段到主题文件中一样可以解决这个问题。
方法5:Yoast SEO 插件
Yoast SEO 插件是一款WordPress搜索优化插件,是 WordPress建站中用户最多的WordPress SEO搜索优化插件。
如果您的网站使用了这款插件,那么在插件 搜索外观 > 分类法 > 分类目录类目网址 项下面的 移除分类前缀 中就可以设置去掉URL中的 /category/;(英文对应路径为 Search Appearance > Taxonomies > Category URLs 项下面的Remove the categories prefix)。
重要提醒
如果在以上各方法设置,网站访问可能会出现 404 错误页面,解决办法也很简单,只要登录后台,在 设置 > 固定链接(Settings > Permalinks) 设置页面,把固定链接格式改成最上面 朴素(Plain),保存设置后,再改回自己的常用格式,再保存一下就可以解决这个bug了。
如果在具体操作中有任何疑问,请随时添加评论提交您的反馈,我们会尽快回复您。
[…] 参考文章:https://www.wppop.com/wordpress-remove-category.html […]