我们通常将WordPress固定链接设为/%postname%.html
或者/%post_id%.html
,可以让页面看起来像静态页,但当文章有分页时,分页链接会变得奇怪,比如:
/morning-paper-news.html/3
/132.html/2
html既然是后缀就应该一直在最后,来自solagirl的《用.html作为url后缀时的分页链接问题》一文,为我们提供了解决办法。
不过原代码只提供了/%postname%.html
的修改方法。
本文提供一下/%post_id%.html
的修改方法。
将下面代码添加到当前主题 functions.php中:
- //适合/%post_id%.html分页链接修正
- classRewrite_Inner_Page_Links_id{
- var$separator;
- function__construct(){
- $this->separator=‘/page-‘;
- if(!is_admin()||defined(‘DOING_AJAX’)):
- add_filter(‘wp_link_pages_link’,array($this,‘inner_page_link_format’),10,2);
- add_filter(‘get_comments_pagenum_link’,array($this,‘comment_page_link_format’));
- 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’));
- register_activation_hook(__FILE__,array($this,‘flush_rewrite_rules’));
- register_deactivation_hook(__FILE__,array($this,‘flush_rewrite_rules’));
- endif;
- }
- functionflush_rewrite_rules(){
- flush_rewrite_rules();
- }
- //修改post分页链接的格式
- functioninner_page_link_format($link,$number){
- if($number>1){
- if(preg_match(‘%<ahref=“.*.html/d*”%’,$link)){
- $link=preg_replace(“%(.html)/(d*)%”,$this->separator.“$2$1”,$link);
- }
- }
- return$link;
- }
- //为新的链接格式增加重定向规则,移除原始分页链接的重定向规则,防止重复收录
- functionpagelink_rewrite_rules($rules){
- foreach($rulesas$rule=>$rewrite){
- if($rule==‘([0-9]+).html(/[0-9]+)?/?$’){
- unset($rules[$rule]);
- }
- }
- $new_rule[‘([0-9]+)(‘.$this->separator.'([0-9]+))?.html/?$’]=‘index.php?p=$matches[1]&page=$matches[3]’;
- return$new_rule+$rules;
- }
- //禁止WordPress将页面分页链接跳转到原来的格式
- functioncancel_redirect_for_paged_posts($redirect_url,$requested_url){
- global$wp_query;
- if(is_single()&&$wp_query->get(‘page’)>1){
- returnfalse;
- }
- returntrue;
- }
- }
- newRewrite_Inner_Page_Links_id();
添加代码后,需要保存一下固定链接设置。
之后再次打开文章分页链接,会变成类似的:
/morning-paper-news/page-2.html
/132/page-2.html
注:上述代码并没有评论分页的链接修正,本人无此刚需未做研究。
其它固定链接形式,需要安装rewrite rules inspector插件查看链接正则写法并修改上述代码。
附:适合/%postname%.html
链接形式原代码:
- /*
- *修复.html分页链接
- */
- classRewrite_Inner_Page_Links{
- var$separator;
- function__construct(){
- $this->separator=‘/page-‘;
- if(!is_admin()||defined(‘DOING_AJAX’)):
- add_filter(‘wp_link_pages_link’,array($this,‘inner_page_link_format’),10,2);//forinnerpages
- add_filter(‘get_comments_pagenum_link’,array($this,‘comment_page_link_format’));
- 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’));
- register_activation_hook(__FILE__,array($this,‘flush_rewrite_rules’));
- register_deactivation_hook(__FILE__,array($this,‘flush_rewrite_rules’));
- endif;
- }
- functionflush_rewrite_rules(){
- flush_rewrite_rules();
- }
- /**
- *修改post分页链接的格式
- *@paramstring$link
- *@paramint$number
- *@returnstring
- */
- functioninner_page_link_format($link,$number){
- if($number>1){
- if(preg_match(‘%<ahref=“.*.html/d*”%’,$link)){
- $link=preg_replace(“%(.html)/(d*)%”,$this->separator.“$2$1”,$link);
- }
- }
- return$link;
- }
- /**
- *修改评论分页链接
- *@paramstring$result
- *@returnstring
- */
- functioncomment_page_link_format($result){
- //Fromhello-world.html/comment-page-1#commentstohello-world/comment-page-1.html#comments
- if(strpos($result,‘.html/’)!==false){
- $result=preg_replace(‘=([^/]+)(.html)/comment-page-([0-9]{1,})=’,“$1/comment-page-$3$2”,$result);
- }
- return$result;
- }
- /**
- *为新的链接格式增加重定向规则,移除原始分页链接的重定向规则,防止重复收录
- *
- *访问原始链接将返回404
- *@paramarray$rules
- *@returnarray
- */
- functionpagelink_rewrite_rules($rules){
- foreach($rulesas$rule=>$rewrite){
- if($rule==‘([^/]+).html(/[0-9]+)?/?$’||$rule==‘([^/]+).html/comment-page-([0-9]{1,})/?$’){
- unset($rules[$rule]);
- }
- }
- $new_rule[‘([^/]+)(‘.$this->separator.'([0-9]+))?.html/?$’]=‘index.php?name=$matches[1]&page=$matches[3]’;
- $new_rule[‘([^/]+)/comment-page-([0-9]{1,}).html(#[^s])?$’]=‘index.php?name=$matches[1]&cpage=$matches[2]’;
- return$new_rule+$rules;
- }
- /**
- *禁止WordPress将页面分页链接跳转到原来的格式
- *@paramstring$redirect_url
- *@paramstring$requested_url
- *@returnbool
- */
- functioncancel_redirect_for_paged_posts($redirect_url,$requested_url){
- global$wp_query;
- if(is_single()&&$wp_query->get(‘page’)>1){
- returnfalse;
- }
- returntrue;
- }
- }
- newRewrite_Inner_Page_Links();