2007年4月2日星期一

去除链接中的"index.php"让WordPress实现全站AJAX

Ajax-wp是一个能让Wordpress实现AJAX化的一个插件,安装方便有快速和定制两种方式,当前版本为0.85。效果可见这里,我使用的是“定制”方式,点击链接时可以实现不用导入页眉、页脚和侧边栏,关于该插件的安装请看原文,在这里就不多说了。

作者的说法是所有链接结构Ajax-wp都可以支持,但是我使用“基于日期和名称”或“数字”时,该插件都会出现BUG,不知道大家有没有碰到这种情况,所以只能使用默认的链接结构了,也就是"homeroot/?p=123"的形式,但是使用这种结构时,页面导航都调用不了该插件,而要接所有的JS文件再LOAD一遍。

禁用该插件后,查看页面导航的链接发现是因为页面的链接使用了"homeroot/index.php?paged=X"的形式,因此只要删除"index.php"这几个字符也即改为"homeroot/?paged=X"的形式就可以让Ajax-wp发挥作用了。Google和Baidu了一圈都没有发现好用的解决方法,只能自己动手了。打开链接模版,路径在"/wp-includes/link-template.php",页面功能的函数为"function get_pagenum_link",研究了半天发现在这个函数里本来就有一句

$qstr = preg_replace("#/*" . $index . "/*#", '/', $qstr);
开发者在注释里说明这句的作用就是"trim the index":)。于是可以在后面加上这一句话,不论前面的$qstr如何替换,到最后把$index剪掉再赋值给$qstr就可以实现效果了。加入的位置见下面红色代码

if ( 1 === $pagenum ) {
$qstr = str_replace('page/1/', '', $qstr); // for mod_rewrite style
$qstr = remove_query_arg('paged', $qstr); // for query style
}
$qstr = preg_replace("#/*" . $index . "/*#", '/', $qstr);
return $qstr;
}

保存完成,体验一下什么叫Web2.0吧。除了评论基本上已实现AJAX化,AJAX评论的插件都与Ajax-wp有冲突,所以还是将就吧。另外把53K的protoype.js文件改为protoype.php让wordpress进行压缩,httpwatch测试了一下,文件大小减小为12K,传输时间大大减少。虽然这种方法让该文件要通过解释器解释,但是只读取一次,折衷吧,而且可以在浏览器CACHE调用。压缩的方法请见这篇文章,在这里不多说。

0 评论: