如何自定义 WordPress 固定网址?认识Rewrite API

0

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

可是有人觉得这种给程序看的网址太丑了,所以就利用撰写Rewrite Rule的方式,来「美化」网址。像是上例id为2749的文章网址,就被美化成为 https://xiumu.org/technology/the-hook-mechanism-and-principle-of-wordpress.shtml 了,但这个网址其实是假的,实际上还是会透过 Rewrite Rule转译成 https://xiumu.org/?p=2749,再丢给WP作处理。

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

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

wordpress_rewrite_api

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:

1
2
3
4
5
6
7
8
9
10
11
add_action( 'init', 'my_rr_url' );
function my_rr_url()
{       
    //Ensure the $wp_rewrite global is loaded
    global $wp_rewrite; 
    add_rewrite_tag('%myname%','([^&]+)');
    add_rewrite_rule( 'haha/([A-Za-z0-9]{1,})/?$','index.php?page_id=8&myname=$matches[1]', 'top' );
 
    //Call flush_rules() as a method of the $wp_rewrite object
    $wp_rewrite->flush_rules();
}

稍微解说一下,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来取值:

1
2
global $wp_query;
echo $wp_query->query_vars['myname'];

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,翻译自MRMU 朽木整编,未经许可禁止转载

发表评论

您的邮箱不会公开,当您的评论有新的回复时,会通过您填写的邮箱向您发送评论内容。 必填字段 *

为何看不到我发布的评论?

正在提交, 请稍候...