如何客制WordPress 固定网址?认识Rewrite API

AD:

121009_0

美化网址

一般动态网站经常利用GET参数附加在网址后方,来作为查询资料的条件,WordPress网站也不例外,假设要观看本站post id为1991的文章,就可以开启http://www.mrmu.com. tw/?p=1991,此时WordPress就会知道你要取出post id为1991的文章,接着把资料拿出来显示。

可是有人觉得这种给程式看的网址太丑了,所以就利用撰写Rewrite Rule的方式,来「美化」网址。像是上例id为1991的文章网址,就被美化成为http://www.mrmu.com.tw/2012/06/29/seo-for-startups-in-under-10-mins/ 了,但这个网址其实是假的,实际上还是会透过Rewrite Rule转译成http://www.mrmu.com.tw/?p=1991,再丢给WP作处理。

本文介绍的Rewrite API就是这种网址美化的工具,这种欺骗大众的工具也有传说对SEO是有帮助的。如果进入WordPress的后台可以在「设定」内找到「固定网址」,来设定网址Rewrite的形式,这里可以让我们轻松的美化预设文章型别的网址。

是的预设的内容都有了美化的网址,但如果今天要处理的是新加入的自订GET参数呢?

Rewrite API实例说明

假设我们拿了某个页面(旧称网志分页,id假设为8)来撰写新功能,并且希望能使用一个自订的GET参数叫myname(假设它的值是’audilu’),那么此例的真实网址就会是:
http://www.example.com/index.php?page_id=8&myname=audilu

假设我们理想中美化过的网址是:
http://www.example.com/haha/audilu/

接着就是Rewrite API上场的时候了! 我们可以利用add_rewrite_rule()这个函数来建立新的Rewrite Rule:

稍微解说一下,rewrite api的使用时机,通常要在init或更早之前。接着第一行宣告的$wp_rewrite,是为了最后要做flush_rules(),这是因为rewrite rules有快取机制,要清一下才能看到最新的情况,等到功能完成时其实可以将flush的code注解掉。

然后是add_rewrite_tag()的部份,在我们要使用自订的GET参数myname之前,必须先向WP「注册」一下,让WP知道这是个合法的参数,所以要利用add_rewrite_tag()来加入myname。

接着是add_rewrite_rul(),第一个参数是网址套用的规则,要放进Regular Expression格式的条件,上例指的是「haha/的后面可放一个以上的英数字」。

第二个参数是要套用的原始网址,要注意这个部份一定要放进「真实的网址」,不能是美化后的形式,上例中的$matches就是开放让你丢值的阵列,从$ matches[1]开始,如果有第二个参数则是$match[2],以此类推。

第三个参数若是top,表示优先进行此规则的配对,若为bottom则会先参考其他的rewrite rule。

至此大致完成了,接着就是要在page页里取得myname这个自订GET参数内的值了,请记住,它不是一般的GET参数,因此不能用$_GET来取值,必须利用$wp_query来取值:

Rewrite Rules出问题了! 该如何除错?

Rewrite Rules的设定其实很容易出事,而且在不使用Rewrite API,只利用后台的「固定网址」进行设定的情况下,就常看到有灾情传出。
如果你仿照上例来改,但却有问题,请:

  1. 检查该篇分页是否真的存在。
  2. 检查你的GET参数是否使用了保留字,可以用print_r($wp_query->query_vars); 来观察query_vars是否有碰撞了。

如果真的还是有问题,除了print_r($wp_rewrite);这种暴力法之外,还有个非常方便的插件可以利用:Monkeyman Rewrite Analyzer

它会列出WP网站里的所有Rewrite Rules,并且可以输入测试网址,来观察会套用到哪一个Rule,真是Rewrite API除错的利器。

参考:http://codex.wordpress.org/Rewrite_API

via mrmu
  • 禅猫
    发表于:2017/02/18 12:39 回复

    貌似好像,见过你有个仿hexo的主题吧,应该是next

发表评论

关注我们