无需插件修改WordPress固定链接:替换分类标签前缀并添加/blog
解决WordPress固定链接:移除分类/标签前缀并添加/blog前缀的完整方案
我帮你梳理了一套完整的解决方案,能完美实现你想要的URL结构,不用依赖插件,纯后台设置加少量代码就能搞定:
一、基础后台设置
首先调整固定链接的基础配置:
- 进入WordPress后台「设置」→「固定链接」
- 在「自定义结构」中填入:
/blog/%category%/%postname%/ - 找到页面下方的「分类基础」,填入空值(直接删除默认的
category,留空);「标签基础」同样填入空值(删除默认的tag) - 暂时不要点击保存,先往下看代码配置
二、添加自定义代码(核心步骤)
仅靠后台设置无法同时满足分类/标签归档的/blog前缀和子分类的URL结构,需要添加代码来调整Rewrite规则和链接生成逻辑。
你可以把以下代码添加到子主题的functions.php文件中(推荐用子主题,避免主题更新丢失代码),或者使用「Code Snippets」插件来导入代码更安全:
1. 处理分类归档的URL规则
// 调整分类归档的Rewrite规则,添加/blog前缀并支持子分类 function custom_category_rewrite_rules() { global $wp_rewrite; // 移除默认的分类Rewrite规则 foreach ($wp_rewrite->rules as $rule => $query) { if (strpos($rule, 'category/') === 0) { unset($wp_rewrite->rules[$rule]); } } // 添加新的分类规则,支持多级子分类 $wp_rewrite->add_rule('blog/(.+?)/?$', 'index.php?category_name=$matches[1]', 'top'); } add_action('generate_rewrite_rules', 'custom_category_rewrite_rules'); // 修改前台分类链接的生成逻辑,确保输出/blog开头的URL function custom_category_permalink($link, $category) { if (is_object($category)) { $category_slug_path = $category->slug; // 递归拼接父分类slug(支持多级子分类) $parent_id = $category->parent; while ($parent_id) { $parent_cat = get_category($parent_id); $category_slug_path = $parent_cat->slug . '/' . $category_slug_path; $parent_id = $parent_cat->parent; } return home_url('/blog/' . $category_slug_path . '/'); } return $link; } add_filter('category_link', 'custom_category_permalink', 10, 2);
2. 处理标签归档的URL规则
// 调整标签归档的Rewrite规则,添加/blog前缀 function custom_tag_rewrite_rules() { global $wp_rewrite; // 移除默认的标签Rewrite规则 foreach ($wp_rewrite->rules as $rule => $query) { if (strpos($rule, 'tag/') === 0) { unset($wp_rewrite->rules[$rule]); } } // 添加新的标签规则 $wp_rewrite->add_rule('blog/(.+?)/?$', 'index.php?tag=$matches[1]', 'top'); } add_action('generate_rewrite_rules', 'custom_tag_rewrite_rules'); // 修改前台标签链接的生成逻辑,确保输出/blog开头的URL function custom_tag_permalink($link, $tag) { if (is_object($tag)) { return home_url('/blog/' . $tag->slug . '/'); } return $link; } add_filter('tag_link', 'custom_tag_permalink', 10, 2);
三、重置Rewrite规则
回到「设置」→「固定链接」页面,点击**「保存更改」**按钮——这一步会自动更新你的.htaccess文件,生成新的Rewrite规则,无需手动修改.htaccess。
四、配置博客首页(/blog)
要实现www.example.com/blog展示所有文章的需求:
- 在后台「页面」→「新建页面」,创建一个标题为「Blog」的空白页面(无需添加内容)
- 进入「设置」→「阅读」,在「你的首页显示」中选择「静态页面」:
- 「首页」选择你原来的站点首页(比如「Home」页面)
- 「文章页」选择刚刚创建的「Blog」页面
- 保存设置,现在访问
/blog就会显示所有文章列表了
五、测试所有场景
现在你可以逐一验证你需要的URL结构:
www.example.com/blog→ 展示全部3篇文章 ✅www.example.com/blog/animals→ 展示分类animals下的全部文章 ✅www.example.com/blog/animals/dogs→ 展示子分类dogs的文章 ✅www.example.com/blog/animals/dogs/post-about-dogs→ 文章详情页 ✅www.example.com/blog/pet-food/→ 标签pet-food的归档页 ✅
注意事项
- 如果你之前使用过Yoast SEO的「移除分类前缀」功能,请先关闭该选项,避免代码冲突
- 测试前请清空浏览器缓存,避免旧URL缓存导致测试错误
- 如果出现404错误,再次点击「设置」→「固定链接」的「保存更改」按钮重置规则,或者检查
.htaccess文件是否有写入权限
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

