内容提要
本文介绍如何让WordPress文章的post_name与ID同步,避免URL中出现中文。方法包括:用SQL语句批量更新已发布文章,执行UPDATE wp_posts SET post_name = ID;在主题functions.php中添加代码,通过save_post钩子,在发布或更新文章时自动将post_name设为ID,并可添加条件排除page等类型。
延伸解读
批量替换前的必要准备
文章提到用SQL语句批量更新已发布文章的post_name,但执行前务必先备份数据库。因为该操作会直接修改wp_posts表,一旦出错可能影响所有文章的固定链接。此外,如果网站已启用缓存或CDN,更新后需清除缓存,否则旧链接可能仍被访问。
自动同步的适用范围与限制
通过save_post钩子自动将post_name设为ID的代码,默认会影响所有文章类型,包括页面和自定义文章类型。如果只想应用于特定类型,需在函数内添加条件判断。文章以排除page为例,但其他类型如产品、作品等也可能需要类似处理,否则可能改变其URL结构。
对现有链接和SEO的潜在影响
将post_name改为ID后,原有包含中文或标题的URL会失效,导致旧链接无法访问。如果网站已被搜索引擎收录或存在外部链接,建议设置301重定向,避免流量损失。同时,新URL虽然简洁,但可能降低关键词相关性,需权衡用户体验与SEO效果。
Q&A
WordPress 文章 post_name 默认是什么?为什么会出现中文 URL?
WordPress 文章的 post_name 如果不手动设置,默认会使用文章标题(title)作为 post_name。当使用 post_name 作为文章 URL 时,如果标题是中文,URL 中就会出现中文。
如何用 SQL 批量将已发布文章的 post_name 改为与 ID 相同?
执行 SQL 语句:UPDATE wp_posts SET post_name = ID; 其中 wp_posts 是 WordPress 数据库中的文章表。
怎样让 WordPress 在发布或更新文章时自动将 post_name 设置为 ID?
在主题的 functions.php 文件末尾添加代码:使用 save_post 钩子,在函数中获取文章对象,检查 post_name 是否与 ID 不同,如果不同则通过 wp_update_post 更新 post_name 为 ID。
自动同步 post_name 与 ID 的代码会影响页面(page)吗?如何排除页面?
默认会影响所有文章类型,包括页面和自定义文章类型。要排除页面,可以在函数内添加条件检查:如果 $post->post_type == 'page' 则直接 return。
除了页面,自动同步 post_name 与 ID 还能排除其他文章类型吗?
可以。在 set_postname_as_id 函数内添加适当的条件检查,例如判断 $post->post_type 是否等于特定类型,从而只对特定类型的文章应用同步。
修改 functions.php 后,需要做什么才能使自动同步生效?
保存并上传 functions.php 文件到 WordPress 主题文件夹。之后每当发布或更新文章时,WordPress 将检查并自动更新 post_name 为 ID。