问题
当文章有分页的时候,WordPress生成的永久链接是page.html/2的形式,前面一段是文章的$link,后面的数字代表分页$number。那么问题来了,挖掘……不对,从逻辑上讲这到底是个html文件还是一个目录呢?
难看
在.html这个静态文件后面加上一个/和数字简直令人摸不着头脑,这还只是其次,重要的是,我发现搜索引擎根本不收录这样奇怪的链接,这个真是无法接受,我写的东西首尾都很重要,不能因为分个页就被忽视了。
不收录
拿这篇文章来看,搜索文章第一页的内容,谷歌收录了:

搜索文章第二页和第三页的内容,根本没有收录:

解决方案
于是我决定DIY WordPress的链接生成与解析规则。
思路
利用filter wp_link_pages_link 将分页链接/123456重写为page-[123456].html。
利用WordPress或者服务器的RewriteRule将page-[123456].html还原为/123456
添加钩子redirect_canonical,防止WordPress从page-[123456].html到/123456的强行跳转。
生成分页html后缀链接
给WordPress主题加入:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | class Rewrite_Inner_Page_Links
{
var $separator ;
var $post_rule ;
function __construct()
{
$this ->separator = '/page-' ;
$this ->post_rule = '(.+?)/([^/]+)(' . $this ->separator . '([0-9]+))+.html/?$' ;
if (!is_admin() || defined( 'DOING_AJAX' )) :
add_filter( 'wp_link_pages_link' , array ( $this , 'inner_page_link_format' ), 10, 2);
add_filter( 'redirect_canonical' , array ( $this , 'cancel_redirect_for_paged_posts' ), 10, 2);
endif ;
if (is_admin()) :
add_filter( 'rewrite_rules_array' , array ( $this , 'pagelink_rewrite_rules' ));
endif ;
}
function inner_page_link_format( $link , $number )
{
if ( $number > 1)
{
if (preg_match( '%<a href=".*\.html/\d*"%' , $link ))
{
$link = preg_replace( "%(\.html)/(\d*)%" , $this ->separator . "$2$1" , $link );
}
}
return $link ;
}
function pagelink_rewrite_rules( $rules )
{
$new_rule [ $this ->post_rule] = 'index.php?name=$matches[2]&page=$matches[4]' ;
return $new_rule + $rules ;
}
function cancel_redirect_for_paged_posts( $redirect_url , $requested_url )
{
global $wp_query ;
if (is_single() && $wp_query ->get( 'page' ) > 1)
{
return false;
}
return true;
}
}
new Rewrite_Inner_Page_Links();
|
这样就得到了将类似http://www.domain.com/program/tokyodaigaku.html/2/ 的分页链接转化为形如 http://www.domain.com/program/tokyodaigaku/page-2.html 的链接。
注意,我的伪静态规则是/%category%/%postname%.html,如果你的规则不同,请自行修改代码或者伪静态规则。
重写URL规则
如果不重写规则的话,WordPress是不认识这个链接的,它以为有个目录叫tokyodaigaku,里面有篇文章叫page-2.html,结果会给出一个无情的404错误:

利用服务器的重写规则
如果是SAE的话,在config.yaml的第一行加入:
复制代码代码如下:
- rewrite: if ( !is_dir() && path ~ "(.+?)/([^/]+)(/page-([0-9]+))+.html/?$") goto "index.php?name=$2&page=$4"
如果不是的话,可以利用WordPress自带的rewrite_rules:
登陆后台——设置——固定链接:

什么也不用填,直接保存更改即可。代码会自动在数据库中硬性加入一条规则:
复制代码代码如下:
"(.+?)/([^/]+)(/page-([0-9]+))+.html/?$" => "index.php?name=$matches[2]&page=$matches[4]"
最终效果
无论是用http://www.domain.com/program/tokyodaigaku.html/2/ 还是 http://www.domain.com/program/tokyodaigaku/page-2.html,都可以访问第二页。
具体效果放在第二页,顺便测试一下分页后缀效果