为什么要去掉分类链接中的 category
在对 WordPress 博客进行优化时,许多细节不容忽视,例如分类链接中的 category 路径。默认情况下,WordPress 分类的链接地址会包含 /category/ 目录,例如:https://youquso.com/category/theme。
这种 URL 结构仍有优化空间。URL 优化是 SEO 中相对重要的环节,如果能去掉分类链接中的 category,可以使链接更简洁、更友好,对网站 SEO 优化有利。
如何去掉分类链接中的 category
下面分享一段用于去掉分类链接中 category 的 WordPress 代码。您无需完全理解其原理,只需将代码正确添加到主题的 functions.php 文件中即可生效。
// 去掉分类链接中的 category
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();
}
// 移除分类基础前缀
add_action('init', 'no_category_base_permastruct');
function no_category_base_permastruct() {
global $wp_rewrite, $wp_version;
if (version_compare($wp_version, '3.4', '<')) {
// 针对 3.4 之前版本的兼容处理
$wp_rewrite->extra_permastructs['category'][0] = '{5cc1b29162d549a8071384de182cc9fc6e6a0fd85e7907f22fd9e18cff4269c3}category{5cc1b29162d549a8071384de182cc9fc6e6a0fd85e7907f22fd9e18cff4269c3}';
} else {
$wp_rewrite->extra_permastructs['category']['struct'] = '{5cc1b29162d549a8071384de182cc9fc6e6a0fd85e7907f22fd9e18cff4269c3}category{5cc1b29162d549a8071384de182cc9fc6e6a0fd85e7907f22fd9e18cff4269c3}';
}
}
// 添加自定义的分类重写规则
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;
if ($category->parent == $category->cat_ID) {
// 防止递归
$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]';
}
// 支持从旧分类基础路径重定向
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]';
return $category_rewrite;
}
// 添加 'category_redirect' 查询变量
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;
}
// 如果设置了 'category_redirect' 则进行重定向
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;
}
使用说明与注意事项
1. 代码放置:请将上述完整代码添加到您当前使用主题的 functions.php 文件末尾。
2. 刷新规则:添加代码后,需要访问一次 WordPress 后台的「设置」→「固定链接」页面,点击「保存更改」以刷新重写规则,使修改生效。
3. 效果:应用后,分类链接将从 https://example.com/category/theme 变为 https://example.com/theme。
4. 兼容性:此代码适用于大多数 WordPress 版本。但请注意,在进行任何核心文件修改前,建议先备份您的网站和数据库。
5. 插件替代方案:如果您觉得手动添加代码较为复杂,也可以考虑使用专门的插件(如 "Remove Category URL" 或 "WP No Category Base")来实现相同功能,操作更简便。