WordPress 重写规则与自定义 URL 结构完全解析:打造 SEO 友好的个性化链接
WordPress 的固定链接设置提供了几种常见的 URL 结构选项,比如“朴素”、“日期和名称”、“文章名”等。但当你的项目需要更个性化的 URL 格式时,默认选项往往满足不了需求。举个例子:你想让产品详情页的 URL 是 products/品牌名/产品型号/,或者想让分类归档页的 URL 变成 category/分类别名/列表/。这些需求都需要通过 WordPress 的重写规则系统来实现。
重写规则的本质是把用户友好的 URL 映射到 WordPress 内部的查询参数上。比如访问 https://你的网站.com/products/samsung/galaxy-s24/,WordPress 需要知道这对应的是哪个产品文章。背后的机制是:WordPress 解析 URL,匹配重写规则,得到 post_type=product、brand=samsung、model=galaxy-s24 这样的查询参数,然后用这些参数去数据库查询。
添加自定义重写规则使用 add_rewrite_rule 函数,通常在 init 钩子中调用:
add_action('init', 'add_custom_rewrite_rules');
function add_custom_rewrite_rules() {
add_rewrite_rule(
'^products/([^/]+)/([^/]+)/?$',
'index.php?post_type=product&brand=$matches[1]&model=$matches[2]',
'top'
);
}
这个规则的意思是:当访问 products/任意字符/任意字符/ 时,WordPress 会把它解析为查询 post_type=product,并把两个路径段分别作为 brand 和 model 参数。但这个规则还不够完整,因为 WordPress 默认不认识 brand 和 model 这两个查询变量,你需要先注册它们:
add_filter('query_vars', 'register_custom_query_vars');
function register_custom_query_vars($vars) {
$vars[] = 'brand';
$vars[] = 'model';
return $vars;
}
注册后,在模板中就可以用 get_query_var('brand') 获取品牌参数,然后进行自定义查询。
对于自定义文章类型,WordPress 默认的 URL 结构是 post_type/文章别名/。如果你想改变这种结构,可以在注册自定义文章类型时指定 rewrite 参数:
register_post_type('product', array(
'rewrite' => array('slug' => 'shop/products', 'with_front' => false),
// 其他参数
));
这样产品页的 URL 就从 product/xxx/ 变成了 shop/products/xxx/。
分类法和标签的 URL 同样可以定制。注册分类法时的 rewrite 参数控制分类归档页的 URL 前缀:
register_taxonomy('product_category', 'product', array(
'rewrite' => array('slug' => 'shop/category', 'hierarchical' => true),
));
设置 hierarchical 为 true 可以让分类 URL 反映层级关系,比如 shop/category/手机/安卓/。
作者存档页、日期存档页、搜索页的 URL 格式也可以通过过滤器修改。author_rewrite_rules、date_rewrite_rules、search_rewrite_rules 等过滤器让你可以完全重写这些页面的 URL 模式。
添加新的重写规则后,最重要的操作是刷新固定链接。在后台设置 → 固定链接中点击保存,或者在 WP-CLI 中执行 wp rewrite flush。不刷新规则的话,新添加的规则不会生效,访问自定义 URL 会返回 404。
重写规则的调试是一个常见难题。规则写错时,你可能会遇到页面互相覆盖、404 错误、或者解析到错误的模板。Query Monitor 插件可以帮助查看当前页面对应的重写规则和查询参数。你也可以使用 wp rewrite list 命令查看当前所有注册的规则,确认你的自定义规则是否在列表中。
重写规则的性能也值得注意。规则越多,每次请求解析的匹配开销越大。尽量使用精确的匹配而不是通配符,规则数量控制在几十条以内。对于大型网站,把规则缓存起来可以减少重复解析的开销。
另外一个重要概念是端点(Endpoint)。端点是在现有 URL 结构上附加一个后缀,比如文章页的 /comments/ 或 /print/。添加端点使用 add_rewrite_endpoint 函数:
add_action('init', 'add_custom_endpoints');
function add_custom_endpoints() {
add_rewrite_endpoint('pdf', EP_PERMALINK | EP_PAGES);
}
这会让每篇文章和页面都支持 /pdf/ 后缀,你可以通过 get_query_var('pdf') 检测到访问这个端点,然后输出 PDF 版本的内容。
自定义 URL 结构的最终目标是同时满足用户体验和搜索引擎优化。清晰的 URL 可以帮助用户理解页面层级,也能让搜索引擎更好地抓取和索引。但要注意,一旦网站上线且被搜索引擎收录,修改 URL 结构会导致大量 404 错误,必须做好 301 重定向。使用 wp_old_slug_redirect 过滤器可以实现旧链接自动重定向到新链接,或者使用 Redirection 插件手动管理重定向规则。

