纯代码实现WordPress 去除 category 和链接重定向
在 WordPress 网站中,默认的分类链接中会包含 “category” 前缀(如
https://www.xcbtmw.com/category/news
)。为了获得更简洁的 URL 和更好的 SEO 效果,许多站长希望去除这个前缀,使链接更具可读性且简洁。本文老白将介绍两段代码,一种保留旧链接兼容性,通过添加重写规则,确保旧链接能成功跳转到新链接,不会出现404 not found nginx报错,适合老站;另一种没有保留跳转功能,代码更少,适用于新站。两段代码都是直接添加到主题的function.php即可使用,告别插件。
key point
两段代码都是老白亲测并且在用的,不是网上那种一大堆拿过来用都用不了的
1. 旧链接跳转代码-老站
这种方法适合已发布大量内容的网站,能确保旧链接不会因为改动而无法访问。通过代码,我们实现了从旧链接到新链接的 301 重定向,以便搜索引擎和用户在访问旧链接时自动跳转至优化后的 URL。
将以下代码添加到主题的 functions.php
文件中:
// 移除分类链接中的 category 字符,保留旧链接兼容性https://www.xcbtmw.com/30331.html
function remove_category_base() {
add_action('created_category', 'flush_rewrite_rules');
add_action('delete_category', 'flush_rewrite_rules');
add_action('edited_category', 'flush_rewrite_rules');
add_action('init', 'remove_category_url_permastruct');
add_filter('category_rewrite_rules', 'remove_category_url_rewrite_rules');
add_filter('query_vars', 'remove_category_url_query_vars');
add_filter('request', 'remove_category_url_request');
}
function remove_category_url_permastruct() {
global $wp_rewrite;
$wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
}
function remove_category_url_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 (0 != $category->parent) {
$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]';
}
// 旧的 category 重写规则,用于重定向到新链接
$old_category_base = get_option('category_base') ? get_option('category_base') : 'category';
$category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';
return $category_rewrite;
}
function remove_category_url_query_vars($public_query_vars) {
$public_query_vars[] = 'category_redirect';
return $public_query_vars;
}
function remove_category_url_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;
}
remove_category_base();
解释:
remove_category_base()
函数注册了一系列的钩子和过滤器,确保 WordPress 将分类结构中的 “category” 基础替换为空字符串。remove_category_url_request()
函数负责检测旧链接并执行 301 重定向,让用户自动跳转到新 URL。
2.不保留跳转代码-新站
对于全新的网站或对旧链接兼容性要求不高的网站,可以选择不包括 301 重定向的代码实现。这种方法简单直接,无需额外的兼容性代码:
// 简化分类链接中的 category 字符,不保留旧链接兼容性https://www.xcbtmw.com/30331.html
function remove_category_base_simple() {
add_action('init', 'flush_rewrite_rules');
add_action('init', 'remove_category_url_permastruct');
add_filter('category_rewrite_rules', 'remove_category_url_rewrite_rules');
}
function remove_category_url_permastruct() {
global $wp_rewrite;
$wp_rewrite->extra_permastructs['category']['struct'] = '%category%';
}
function remove_category_url_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 (0 != $category->parent) {
$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]';
}
return $category_rewrite;
}
remove_category_base_simple();
3.说明
无论选择保留旧链接兼容性还是直接优化新链接,都要在完成代码修改后,前往 设置 > 固定链接
并点击“保存更改”以刷新 WordPress 的伪静态重写规则。
此外,为防止流量丢失和 SEO 问题,建议检查并确保所有链接工作正常。
更多建站经验和WordPress技巧请点击文末标签阅读!