文章目录
在我们使用WordPress的时候,默认的前端分类URL链接中会有“category”在链接中,这对我们而言显示效果并不好。因此,对于一个合格的站长而言是有必要做一些调整,移除这个前缀,让它显示更直观美好的。
那么,我们需要怎么做才可以移除分类链接中默认的“category”前缀呢!其实操作起来也很简单。
操作方法:
移除WordPress分类URL中默认的"category"前缀,通过以下代码就可实现,将以下代码放置在主题文件的“functions.php”文件中保存,再到后台“设置——固定链接”刷新保存就可以生效了。
// 分类去除默认
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;
}
代码解释:
这段代码的主要作用是 移除WordPress分类URL中的默认"category"前缀,并确保修改后的URL能够正常工作(包括分页、Feed等),同时处理旧URL的重定向问题。以下是代码的详细功能解析:
1. 刷新重写规则(Flush Rules)
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();
}
- 作用:在以下场景强制刷新WordPress的重写规则(URL结构):
- 切换主题时(
load-themes.php) - 分类被创建、编辑或删除时
- 切换主题时(
- 目的:确保自定义的分类URL规则及时生效。
2. 移除分类URL中的"category"前缀
add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
global $wp_rewrite, $wp_version;
if (version_compare($wp_version, '3.4', '<')) {
$wp_rewrite->extra_permastructs['category'][0] = '%category%';
} else {
$wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
}
}
- 作用:修改WordPress的分类URL结构,将默认的
/category/分类名称/改为/分类名称/。 - 兼容性:支持WordPress 3.4及以上和以下版本。
3. 生成自定义分类重写规则
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');
function no_category_base_rewrite_rules($category_rewrite) {
$category_rewrite = array();
$categories = get_categories(array('hide_empty' => false));
foreach ($categories as $category) {
$category_nicename = $category->slug;
// 处理父级分类(生成嵌套分类的URL)
if ($category->parent != 0) {
$category_nicename = get_category_parents($category->parent, false, '/', true) . $category_nicename;
}
// 添加分类的Feed规则
$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]';
}
// 旧URL(含/category/)的重定向规则
$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]';
return $category_rewrite;
}
- 作用:
- 为所有分类(包括嵌套分类)生成新的URL规则,确保以下功能正常:
- 基础分类页(如
/news/) - 分类分页(如
/news/page/2/) - 分类Feed(如
/news/feed/)
- 基础分类页(如
- 捕获旧URL(如
/category/news/)并重定向到新URL(如/news/)。
- 为所有分类(包括嵌套分类)生成新的URL规则,确保以下功能正常:
4. 处理旧URL的重定向
// 添加查询变量
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;
}
// 执行301重定向
add_filter('request', 'no_category_base_request');
function no_category_base_request($query_vars) {
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/news/)时,触发301重定向到新URL(如/news/)。 - 避免SEO损失(301是永久重定向,搜索引擎会传递权重)。
- 当用户访问旧URL(如
代码的完整工作流程
- 移除前缀:通过修改
$wp_rewrite移除URL中的/category/。 - 生成规则:为所有分类动态生成新的URL规则(包括分页、Feed)。
- 捕获旧URL:将含
/category/的旧URL匹配为category_redirect查询变量。 - 重定向旧URL:通过301跳转到新URL,确保用户和搜索引擎无缝过渡。
注意事项
- 插件冲突:如果已安装其他修改分类URL的插件,需禁用它们。
- 缓存问题:修改后需清除WordPress缓存(或服务器缓存)。
- 测试验证:检查分类页、分页、Feed是否正常,旧URL是否正确跳转。
如果需要更简单的解决方案,建议直接使用 WP No Category Base 插件。此代码适合需要深度自定义或学习WordPress重写规则的用户。
