WooCommerce分类URL自定义:保留Slug同时显示名称
解决方案:保留分类Slug的同时用名称生成友好URL
一、自定义代码实现
这种场景下自定义代码是最灵活的,下面是完整的代码片段,你可以放到主题的functions.php或者自定义插件里:
1. 生成基于分类名称的友好URL
过滤产品分类的永久链接,把原slug替换成处理后的名称(转小写、空格换连字符):
add_filter('term_link', 'wc_product_cat_permalink_use_name', 10, 3); function wc_product_cat_permalink_use_name($permalink, $term, $taxonomy) { if ($taxonomy !== 'product_cat') return $permalink; // 处理分类名称:转小写、替换空格为连字符、移除特殊字符 $name_slug = sanitize_title($term->name); // 替换原slug为处理后的名称 $permalink = str_replace($term->slug, $name_slug, $permalink); return $permalink; }
2. 添加重写规则,让WordPress识别新URL
添加重写规则,把请求的名称映射到对应的分类slug:
add_action('init', 'wc_product_cat_name_rewrite_rule'); function wc_product_cat_name_rewrite_rule() { // 匹配一级分类URL结构 add_rewrite_rule( 'shop/([^/]+)/?$', 'index.php?product_cat=$matches[1]', 'top' ); // 匹配二级子分类URL结构 add_rewrite_rule( 'shop/([^/]+)/([^/]+)/?$', 'index.php?product_cat=$matches[2]', 'top' ); }
3. 修正分类查询,通过名称找到对应slug的分类
拦截查询,把请求的名称转成对应分类的slug:
add_action('pre_get_posts', 'wc_product_cat_query_by_name'); function wc_product_cat_query_by_name($query) { if (!is_admin() && $query->is_main_query() && $query->is_tax('product_cat')) { $cat_name = $query->get('product_cat'); if ($cat_name) { // 通过处理后的名称匹配分类 $terms = get_terms(array( 'taxonomy' => 'product_cat', 'meta_query' => array( array( 'key' => 'name', 'value' => sanitize_title($cat_name), 'compare' => 'LIKE' ) ), 'hide_empty' => false )); if (!empty($terms)) { $query->set('product_cat', $terms[0]->slug); } } } }
注意事项
- 代码添加后,必须去设置→固定链接页面点击「保存更改」刷新重写规则,否则新URL不会生效。
- 若有重名分类,
sanitize_title会自动添加后缀(比如两个「红色」会生成red和red-2),避免URL冲突。 - 可添加301重定向,把旧slug URL转到新名称URL,保护SEO权重:
add_action('template_redirect', 'wc_product_cat_redirect_old_slug'); function wc_product_cat_redirect_old_slug() { if (is_tax('product_cat')) { $term = get_queried_object(); $current_url = home_url(add_query_arg(array(), $wp->request)); $new_url = get_term_link($term); if ($current_url !== $new_url) { wp_redirect($new_url, 301); exit; } } }
二、插件推荐
如果不想写代码,可尝试以下插件:
- Permalink Manager Lite:支持自定义分类永久链接结构,在插件设置→Taxonomies→Product Categories→Permalink Structure中,选择自定义结构并使用
%term_name%替代%term_slug%即可。 - Custom Permalinks:适合分类数量少的场景,直接在分类编辑页面的「Custom Permalink」字段,手动输入用名称生成的URL路径。
关键提醒
- 无论用代码还是插件,分类的slug字段都不会被修改,完全不影响你和外部管理软件的同步逻辑。
- 测试时要验证所有分类(含子分类)的URL访问是否正常,以及产品页面的分类跳转链接是否指向新的名称URL。
内容的提问来源于stack exchange,提问作者user3799115
相关产品推荐
相关产品推荐

