WordPress 的每个文章网址都由两部分组成:你在「设置 → 固定链接」里一次性选定的固定链接结构,以及它为每篇文章生成的 slug(别名)。本指南讲清六种固定链接设置该怎么选,逐步说明 WordPress 如何把标题变成 slug(包括中文标题会变成什么样),以及之后修改 slug 或整个结构时怎样做才安全。文中关于 WordPress 行为的说明均来自 WordPress 官方文档与代码参考(见文末参考资料);表格里的 WordPress slug 由逐行移植的 WordPress 自带函数 sanitize_title_with_dashes() 实际跑出,对照列是我们 URL Slug 生成器 的真实输出。

提示

简短回答

  • 大多数网站选「文章名」。 它生成 /sample-post/ 这样简短、可读、不会过时的网址。
  • 发布前就定好。 WordPress 官方文档说固定链接是永久网址,不应更改;事后改结构,全站所有文章网址会一起变。
  • 重要文章自己写 slug。 WordPress 会直接删掉 & 和 %,保留所有小词;中文标题则会存成一长串百分号编码。
  • 文章改 slug 会自动跳转,页面不会。 已发布文章改了 slug,WordPress 会记住旧 slug 并做 301 跳转;「页面」等层级型内容需要你自己加跳转。

WordPress 支持三类固定链接:朴素(Plain)、美观(Pretty)和「几乎美观」(Almost Pretty)。朴素链接形如 ?p=123,任何服务器都能用,也是新装站点的默认设置,但官方文档自己也说它对用户不友好;美观链接包含文章名等单词;「几乎美观」链接与美观链接相同,只是前面多了 /index.php/。后两者都需要服务器做好相应配置,一般由主机商完成。在 设置 → 固定链接 里有六种常用设置:

设置文章 123「Sample Post」的网址示例适合
朴素https://example.com/?p=123不适合公开站点:网址说明不了任何内容
日期和名称型https://example.com/2026/10/27/sample-post/日期很重要的新闻站
月份和名称型https://example.com/2026/10/sample-post/更新频繁、时效性强的文章
数字型https://example.com/archives/123很少是好选择:用编号代替了单词
文章名https://example.com/sample-post/大多数博客、商店和企业网站
自定义结构https://example.com/%category%/%postname%/分类体系稳定的网站

自定义结构由结构标签拼成:%year%、%monthnum%、%day%、%hour%、%minute%、%second%、%post_id%、%postname%、%category% 和 %author%。官方文档建议结构以 %post_id% 或 %postname% 结尾,这样每个网址都能唯一指向一篇文章。

该选哪种结构

没有特别理由就用「文章名」。 这与 Google 建议用简单、有描述性的单词而非冗长编号的做法一致,也能让网址保持简短。我们的 URL Slug 长度指南 解释了为什么短 slug 更易读、易分享、易维护。

只有日期本身是内容一部分时才放日期。 网址里带日期,常青教程一到新年份就显得陈旧;而且以后想去掉日期,就得改掉所有网址。

慎用 %category%。 它能补充上下文,但一篇文章属于多个分类时,网址里只会显示按字母顺序排在最前的那个;文章换分类,网址也跟着变。分类前缀和标签前缀(默认是 category 和 tag)可以在可选设置里改名,但不能彻底去掉。

公开站点别用朴素型和数字型。 两者都没法告诉读者或搜索引擎这一页讲什么。

WordPress 如何把标题变成 slug

保存文章时如果你没填 slug,WordPress 会把标题交给 sanitize_title()。在保存场景下,这个函数先调用 remove_accents() 去掉重音,再执行 sanitize_title 过滤器,默认处理函数是 sanitize_title_with_dashes()。后者依次:

  1. 去掉 HTML 标签,以及不属于编码字节的零散 %;
  2. 转成小写,把每个非 ASCII 字符按 UTF-8 做小写十六进制的百分号编码,编码后最多保留 200 个字符;
  3. 把不换行空格、短破折号、长破折号和 / 变成连字符,删掉弯引号、版权符号、省略号等符号;
  4. 把句点变成连字符,删除除 a–z、0–9、空格、_、- 以及编码字节中的 % 以外的所有字符;
  5. 把空白变成连字符,合并连续连字符,并去掉首尾连字符。

落到真实标题上是这样(右列为我们生成器的默认输出):

标题WordPress slug我们的生成器
This Is A Great Post!this-is-a-great-postthis-is-a-great-post
I'm in LOVE with WordPress!!!1im-in-love-with-wordpress1im-in-love-with-wordpress-1
10 Tips & Tricks for Faster Pages10-tips-tricks-for-faster-pages10-tips-and-tricks-for-faster-pages
Price: 50% Off Todayprice-50-off-todayprice-50-percent-off-today
Node.js vs. Denonode-js-vs-denonode-js-vs-deno

前两行是 WordPress 官方文档里的例子。差别不大但看得出来:WordPress 直接删掉 & 和 %,不会写成单词;中间只隔着标点时,数字会和前一个单词粘在一起。两种结果都不算错,但如果你在意准确措辞,就自己填 slug。

WordPress 还会保留所有小词。想要 10-tips-tricks-faster-pages 这种更短的写法,就在别名框里手动删掉停用词,或者在我们的生成器里勾选 去除停用词。

中文及其他非拉丁文字标题

sanitize_title_with_dashes() 不做音译。中文、日文、西里尔字母等非拉丁字符会被保留,并以百分号编码的形式存储:

标题WordPress slug
重庆火锅攻略%e9%87%8d%e5%ba%86%e7%81%ab%e9%94%85%e6%94%bb%e7%95%a5
北京 Travel Guide 2026%e5%8c%97%e4%ba%ac-travel-guide-2026

浏览器会把这些字节解码,在地址栏里显示成 重庆火锅攻略,所以你自己看着没问题。可一旦把链接复制到邮件、聊天软件或表格里,它常常以编码形式出现:六个汉字就是 54 个字符。原因是每个汉字在 UTF-8 里占 3 个字节,每个字节又变成 %e9 这样的三个字符。

200 字符的上限也要留意:每个汉字编码后占 9 个字符,纯中文标题最多只能保留 22 个汉字,后面的部分会被悄悄截掉。

中文 WordPress 站点有三种选择:

  1. 保留中文 slug。 它合法,Google 也支持,在地址栏里读起来也自然。标题要短,别撞上 22 个汉字的上限。
  2. 用拼音。 我们的 URL Slug 生成器 能把中文转成无声调拼音:重庆火锅攻略 会变成 chong-qing-huo-guo-gong-lve,复制到别名框即可。
  3. 用英文 slug, 比如 chongqing-hot-pot-guide,适合读者也会用英文搜索的情况。

我们的 中文网址 slug 指南 详细对比了这三种方案,包括自动拼音的多音字问题。带重音的拉丁文字标题,WordPress 的 remove_accents() 已经能去掉大部分重音;各语言的细节见 如何音译 slug。

重复 slug 与纯数字 slug

WordPress 会保证文章 slug 唯一。同一内容类型里已经有 sample-post 时,wp_unique_post_slug() 会在末尾加数字,依次尝试 sample-post-2、sample-post-3……草稿和待审文章在发布前不做这项检查,所以重复往往在你点击「发布」的那一刻才出现。

纯数字 slug 会被特殊处理,因为它可能和日期归档冲突。比如结构是 /%year%/%postname%/ 时,slug 为 5 看起来就像五月的归档页,WordPress 会给它加后缀。何况用单词做 slug 本来就更好。

新网址末尾出现 -2 时,先查一查是否有同名的旧草稿、回收站里的文章或附件,改好 slug 再分享链接。

发布后修改 slug

文章: 修改已发布文章的 slug 时,WordPress 会把旧 slug 存进这篇文章的 _wp_old_slug 元数据。以后有人访问旧网址并得到 404 时,wp_old_slug_redirect() 会按旧 slug 找到文章,用 301 跳转到当前固定链接。找不到旧 slug 时,它还会按文章的旧发布日期查找,所以文章改了日期,按日期组成的网址也能继续用。

页面: wp_old_slug_redirect() 不处理层级型内容类型,页面不在其中。页面改名后,你需要自己在服务器配置或跳转插件里加 301 跳转。

修改整个固定链接结构 会让全站网址一起改变,别指望 WordPress 都能兜住。把它当成一次迁移:导出旧网址,逐条对应新网址,再用我们的 301 重定向生成器 生成规则。我们的 批量改网址指南 讲了包括测试在内的完整流程。在 .htaccess 里,把你的规则放在 # BEGIN WordPress 区块之上,免得 WordPress 先接管请求。

注意

常见错误

  • 公开站点一直用朴素链接。 第一篇文章上线前就选好美观结构。
  • 从日期结构切到文章名却不做跳转。 所有旧链接和书签都会失效。
  • 给页面改名却以为会自动跳转。 只有文章才有旧 slug 跳转。
  • 重要文章完全依赖自动 slug。 检查是否丢了 & 或 %、数字是否粘在单词上、中文 slug 是否变成了很长的百分号编码。
  • 无视 -2 后缀。 它通常意味着有被遗忘的草稿或附件占用了这个 slug。
  • 只用数字做 slug。 可能与日期归档冲突,也不能告诉读者任何信息。
[ ] 上线前已选定固定链接结构(大多数站点选「文章名」)
[ ] 自定义结构以 %postname% 或 %post_id% 结尾
[ ] 常青内容的网址不含日期
[ ] 重要文章的 slug 已手动填写或检查
[ ] 中文标题:中文 slug 足够短,或已填拼音/英文 slug
[ ] 没有意外的 -2 后缀;没有纯数字 slug
[ ] 改名的页面已手动加 301 跳转
[ ] 修改结构按迁移处理:映射表、规则、测试
[ ] .htaccess 中跳转规则位于 # BEGIN WordPress 之上

用工具生成 WordPress slug

把标题粘贴到 URL Slug 生成器,即可得到干净的 slug:& 会写成单词,可选去除停用词,中文可转拼音;再复制到 WordPress 的别名框。整批导出的文章标题可以交给 批量 CSV Slug 生成器 一次生成,并自动处理重复。发布前,用 Slug 检查器 查出大写字母、下划线等问题。

参考资料

FAQ

常见问题

WordPress 哪种固定链接结构对 SEO 最好?

对大多数网站来说是「文章名」。它生成简短、有描述性的网址,正是 Google 网址指南所推荐的。只有发布日期本身是内容一部分时(比如新闻)才使用日期结构。

修改 slug 后,WordPress 会把旧网址跳转过去吗?

已发布的文章会:WordPress 保存旧 slug,并对旧网址的请求做 301 跳转到新网址。页面和其他层级型内容类型不在此列,需要你自己添加跳转。

为什么我的 WordPress 网址末尾多了 -2?

同一内容类型中已有别的条目在用这个 slug,常见的是草稿、回收站里的文章或附件。WordPress 会加 -2、-3 等后缀保证唯一。改名或删除那个条目后,再编辑这篇文章的 slug。

中文 WordPress 文章该用中文 slug 还是拼音 slug?

都可以。中文 slug 在浏览器里显示自然,但以百分号编码存储,分享时显得很长,而且最多只能保留 22 个汉字;拼音或英文 slug 更短、更通用。选定一种风格并保持一致即可。