在使用 WordPress 构建电商网站(特别是使用 WooCommerce)或其他自定义内容类型的网站时,我们经常会使用“自定义分类法”(Custom Taxonomy)来组织内容。例如,WooCommerce 默认提供一个 product_cat
分类法,用于为商品添加分类。
这时,商品分类的链接可能会是这样的:
http://example.com/product_cat/products/
但在很多实际项目中,用户或 SEO 优化需求可能要求更简洁、更友好的 URL,例如:
http://example.com/products/
也就是说,我们希望去掉分类链接中的 product_cat
前缀。
本篇文章将从 插件方式 和 代码方式 两种思路出发,讲解如何实现这一目的,并进一步扩展相关知识点。
一、为什么 WordPress 分类链接会带上前缀?
WordPress 的分类法 URL 默认遵循这样一个规则:
/{taxonomy_slug}/{term_slug}/
例如:
taxonomy_slug
是分类法的 slug,比如product_cat
term_slug
是具体分类项的 slug,比如products
这是 WordPress 内部通过 Rewrite API 设置的默认行为,目的是为了防止路由冲突,也便于多层分类结构的管理。
二、方法一:使用插件实现分类链接去前缀(推荐初学者)
✅ 插件推荐:Permalink Manager Lite
使用步骤:
- 在后台插件中心搜索“Permalink Manager Lite”,安装并激活。
- 进入后台菜单:Tools(工具)→ Permalink Manager。
- 找到你想修改的分类项(如
products
),点击“Edit”。 - 修改 URL slug,将其前缀去掉,保存即可。
- 进入 设置 → 固定链接,点击“保存更改”以刷新规则。
三、方法二:通过代码去掉分类法前缀(适合开发者)
步骤 1:重新注册分类法,去掉 rewrite 前缀
add_action( 'init', 'custom_rewrite_product_cat', 11 );
function custom_rewrite_product_cat() {
register_taxonomy( 'product_cat', 'product', array(
'label' => 'Product Categories',
'hierarchical'=> true,
'rewrite' => array(
'slug' => '', // 去掉 slug
'with_front' => false,
'hierarchical' => true
),
) );
}
注意:如果这是 WooCommerce 的默认分类法,一定要在 WooCommerce 注册之后重新注册覆盖,使用
priority 11
比较合适。
步骤 2:添加自定义 rewrite 规则
add_action( 'init', 'custom_product_cat_rewrite_rules' );
function custom_product_cat_rewrite_rules() {
add_rewrite_rule(
'^([^/]+)/?$',
'index.php?product_cat=$matches',
'top'
);
}
步骤 3:刷新固定链接
进入后台 设置 → 固定链接,点击“保存更改”以刷新 rewrite 规则。
四、可能出现的问题及优化建议
⚠️ 1. URL 冲突风险
当你将分类链接设置为根目录(无前缀)时,可能与页面、文章或其他 URL 冲突,例如:
- 你有一个页面
/products/
,而你也有一个分类products
- 你设置了一个自定义文章类型
products
,也有相同的分类 slug
建议使用唯一性较高的分类 slug,或者保留一个简短的前缀如 p/
,避免冲突。
⚠️ 2. WooCommerce 默认分类法限制
WooCommerce 的 product_cat
是自动注册的,直接注册可能会无效或被覆盖。解决方案是:
- 使用
remove_action()
移除 WooCommerce 注册的分类 - 或者使用高优先级重新注册(如上述代码使用
priority = 11
)
✅ Bonus:为所有自定义分类去前缀的通用代码思路
function remove_taxonomy_base($taxonomy) {
add_action('init', function() use ($taxonomy) {
global $wp_rewrite;
$taxonomy_object = get_taxonomy($taxonomy);
register_taxonomy($taxonomy, $taxonomy_object->object_type, array_merge((array) $taxonomy_object, array(
'rewrite' => array(
'slug' => '',
'with_front' => false,
'hierarchical' => true
)
)));
add_rewrite_rule(
'^([^/]+)/?$',
'index.php?' . $taxonomy . '=$matches',
'top'
);
}, 11);
}
remove_taxonomy_base('product_cat');
五、总结
方法 | 适合人群 | 优点 | 缺点 |
---|---|---|---|
使用插件(Permalink Manager) | 初学者 | 快捷方便,界面操作 | 插件依赖,功能冗余 |
使用代码 | 开发者 | 灵活可控,可自动化 | 易出错,需手动刷新规则 |
📌 最后建议
- 如果你只是偶尔做 SEO 优化,推荐使用插件解决;
- 如果你是主题或插件开发者,建议用代码方式,并写好冲突检测逻辑;
- 永远记得刷新固定链接;
- 若使用 WooCommerce,一定注意 WooCommerce 的加载顺序和注册优先级。
如果你在实际操作中遇到任何问题,欢迎在评论区留言或联系我进一步讨论!