这是一篇很短、很散的文章,但缘分到了它可能拯救你两三天人生。
直接开说,WordPress URL会有什么坑:
url非法字符
注意,并不是所有ASCII字符都是合法字符
根据RFC 3986,合法内容只有以下几个
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=
其它一切字符,都应该转义为%hh
形式
如果你企图使用|
等字符作为查询字符串的内联分隔符key=foo|bar
,那恭喜你,成功踩到深坑
这些特殊字符会在重定向时被WordPress清除,上面例子变成key=foobar
而且只有在重定向时才会发生,因此非常难发现错误!
重复查询字符串
不要使用重复的查询字符键key=a&key=b
否则只有最后一个值能被传入
蛇皮谷歌好像用过重复查询字符键,害了不少人
保留的关键词
WordPress有一些保留关键词,为了避免暴毙最好不要尝试以下“作死”行为:
- 手动将它们加入
$_GET
或$_POST
数组 - 注册同名的
taxonomy
或或者slug
- 使用同名的查询字符键
注意:当你注册了taxonomy
且提供了rewrite
参数时,rewrite
的值也会注册为已使用的关键词,它们在查询字符串中已有本身的含义(代表该taxonomy
),不要再拿来当其它作用。
url重写规则
小坑
在使用add_rewrite_rule
添加重写规则时,需要留意第二个参数query
这个东西必须是以index.php
开头,然后后面跟所需的查询字符串(WordPress里一切路径数据都是查询字符串)
比如加载id为501的文章:
add_rewrite_rule('^testpage/?', 'index.php?p=501', 'top');
如果你需要重定向,请使用
template_redirect
hook如果你尝试输入
index.php
以外的东西,祝你好运:)
大坑
使用add_rewrite_rule
之后,必须刷新永久链接。你有两个做法:
- 在php中运行
flush_rewrite_rules()
函数flush_rewrite_rules()
很慢,不要每次运行都执行,特别是在product环境
- 在控制台中,找到:设置>固定链接>保存更改