WordPress 重写规则终极指南
WordPress 重写(rewrite)是 WordPress 的核心功能之一,用于将用户友好的 URL 转换为实际的查询参数,从而让网站具有更简洁、可读性更强的链接结构。WordPress 使用 WP_Rewrite 类来管理这些重写规则。
1. 基本概念
WordPress 的重写系统基于 Apache 的 mod_rewrite 模块,它通过 .htaccess 文件将用户请求的 URL 映射到 WordPress 的内部查询参数。例如:
- 用户访问:
example.com/blog/post-title/ - 实际处理:
index.php?name=post-title
2. 重写规则生成
WordPress 在安装或更新时会自动生成 .htaccess 文件中的重写规则。这些规则通常位于 WordPress 安装目录下的 .htaccess 文件中。
一个典型的 WordPress .htaccess 文件内容如下:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
这些规则的作用是:
- 如果请求的是
index.php,直接停止处理。 - 如果请求的文件或目录不存在,则将请求重写到
index.php,由 WordPress 处理。
3. 自定义重写规则
WordPress 允许开发者通过 add_rewrite_rule() 函数添加自定义的重写规则。这在创建自定义文章类型、自定义页面模板或自定义 API 接口时非常有用。
示例代码:
function my_custom_rewrite_rule() {
add_rewrite_rule(
'^custom-page/([^/]+)/?$',
'index.php?custom_var=$matches[1]',
'top'
);
}
add_action('init', 'my_custom_rewrite_rule');
在此示例中,URL example.com/custom-page/value/ 会被映射到 index.php?custom_var=value。
4. 重写标签(Rewrite Tags)
WordPress 使用“重写标签”来识别和匹配特定的查询变量。例如,%postname% 是用来匹配文章标题的标签。
可以通过 add_rewrite_tag() 添加自定义的重写标签:
function my_custom_rewrite_tag() {
add_rewrite_tag('%custom_var%', '([^&]+)');
}
add_action('init', 'my_custom_rewrite_tag');
5. 重写规则的存储与刷新
WordPress 将所有重写规则存储在一个名为 rewrite_rules 的选项中,该选项保存在数据库中。每次添加或修改重写规则后,需要运行 flush_rewrite_rules() 来刷新规则。
示例:
function my_flush_rules() {
global $wp_rewrite;
$wp_rewrite->flush_rules();
}
add_action('after_switch_theme', 'my_flush_rules');
注意:flush_rewrite_rules() 应谨慎使用,因为它会重新生成所有重写规则,可能会影响性能。
6. 重写规则的应用场景
- 自定义文章类型(如产品、项目等)
- 自定义查询变量(如
author_id,category_slug等) - API 接口(如
/api/posts) - 静态页面(如
/about-us映射到特定页面)
7. 重写规则的优先级
在使用 add_rewrite_rule() 时,可以指定规则的优先级('top' 或 'bottom')。默认是 'bottom'。将规则放在顶部可以确保它优先于其他规则被处理。
8. 重写规则的调试
要查看当前的重写规则,可以在 WordPress 后台访问 tools.php?page=permalinks,或者通过以下代码输出所有重写规则:
global $wp_rewrite;
print_r($wp_rewrite->rules);
9. 重写规则与永久链接结构
WordPress 提供了多种永久链接结构,如:
- 默认结构:
/index.php?year=%year%&monthnum=%monthnum%&day=%day%&name=%postname% - 自定义结构:如
/blog/%year%/%monthnum%/%day%/%postname%/
这些结构决定了如何将 URL 映射到查询参数。
10. 重写规则与插件/主题兼容性
一些插件和主题可能会修改或扩展 WordPress 的重写规则,因此在开发过程中需要注意冲突问题。建议使用 add_rewrite_rule() 和 add_rewrite_tag() 进行自定义,而不是直接修改 .htaccess 文件。
11. 重写规则的限制
- 不支持正则表达式中的捕获组以外的复杂逻辑。
- 每次添加新规则后都需要调用
flush_rewrite_rules()。 - 规则数量有限制,过多的规则可能影响性能。
12. 重写规则与缓存
如果使用缓存插件(如 W3 Total Cache、WP Super Cache),可能需要手动清除缓存以使新的重写规则生效。某些缓存插件会缓存 .htaccess 文件的内容。
13. 重写规则与多站点(Multisite)
在 WordPress 多站点环境中,每个站点都有自己的 .htaccess 文件。重写规则的处理方式与单站点类似,但需要考虑子域名或子目录的结构。
14. 重写规则与伪静态
WordPress 的重写规则本质上是伪静态机制的一部分,它允许服务器将动态请求转换为静态 URL,提升 SEO 和用户体验。
15. 重写规则与 REST API
WordPress 的 REST API 也依赖于重写规则,其基础路径(如 /wp-json/)是由 WordPress 内部注册的规则处理的。
16. 重写规则与自定义 Post Type
当注册自定义文章类型时,可以通过设置 rewrite 参数来定义其永久链接结构。例如:
register_post_type('product', array(
'labels' => array('name' => 'Products'),
'public' => true,
'rewrite' => array('slug' => 'products'),
));
这会将产品文章的 URL 设置为 /products/%productname%/。
17. 重写规则与自定义字段
某些插件会利用重写规则来支持基于自定义字段的 URL 结构,例如根据某个字段值动态生成 URL。
18. 重写规则与用户自定义 URL
开发者可以通过 request 查询变量来访问重写后的参数,例如:
if (isset($_GET['custom_var'])) {
$value = $_GET['custom_var'];
}
也可以通过 get_query_var('custom_var') 获取值。
19. 重写规则与路由
在 WordPress 中,重写规则实际上是在进行“路由”操作,即将用户请求的 URL 路径转换为 WordPress 内部处理的查询参数。
20. 重写规则与插件开发
在开发 WordPress 插件时,重写规则是实现自定义 URL 和 API 接口的重要工具。插件可以通过 add_rewrite_rule() 注册自己的规则,并通过 add_rewrite_tag() 定义自定义的查询变量。
以上是对 WordPress 重写机制的详细说明。






