WORDPRESS用.HTML作为URL后缀时的分页链接问题

 2016年3月26日 |  1 条评论 |   756

固定链接设为 /archives/%postname%.html 时可以让页面看起来像静态页,同时会使分页链接变得十分奇怪,比如评论的分页链接会变成”hello-world.html/comment-page-1#comments”,html既然是后缀就应该一直在最后,本文介绍如何实现。

目标

假设页面链接为hello-world.html

当在文章中插入分页时,希望分页链接格式为 hello-world/page-2.html

评论分页链接则为 hello-world/comment-page-2.html

实现方法

  1. 通过filter将分页链接改成希望的格式,分别用到vwp_link_pages_link get_comments_pagenum_link
  2. 添加自定义跳转规则,利用filter rewrite_rules_array
  3. 取消Canonical URL(标准链接)跳转,否则使用新链接访问时WordPress会强制跳转到原来的链接

代码

下面这段代码放在主题的functions.php中,保存后需要到设置中重新保存一下固定链接

  1. class Rewrite_Inner_Page_Links{
  2.     var $separator;
  3.     var $post_rule;
  4.     var $comment_rule;
  5.     function __construct(){
  6.         $this->separator = ‘/page-‘;
  7.         $this->post_rule = ‘archives/([^/]+)(‘.$this->separator.'([09]+))?.html/?$’;
  8.         $this->comment_rule = ‘archives/([^/]+)/comment-page-([09]{1,}).html(\#[^\s])?$’;
  9.         if( !is_admin() || defined( ‘DOING_AJAX’ ) ) :
  10.             add_filter( ‘wp_link_pages_link’, array( $this, ‘inner_page_link_format’ ), 102 ); // for inner pages
  11.             add_filter( ‘get_comments_pagenum_link’, array( $this, ‘comment_page_link_format’ ) );
  12.             add_filter( ‘redirect_canonical’, array( $this, ‘cancel_redirect_for_paged_posts’ ), 102 );
  13.         endif;
  14.         if( is_admin() ) :
  15.             add_filter( ‘rewrite_rules_array’, array( $this, ‘pagelink_rewrite_rules’ ) );
  16.         endif;
  17.     }
  18.     /**
  19.      * 修改post分页链接的格式
  20.      * @param string $link
  21.      * @param int $number
  22.      * @return string
  23.      */
  24.     function inner_page_link_format( $link, $number ){
  25.         if( $number > 1 ){
  26.             if( preg_match( ‘%<a href=“.*\.html/\d*”%’, $link ) ){
  27.                 $link = preg_replace( “%(\.html)/(\d*)%”, $this->separator.“$2$1”, $link );
  28.             }
  29.         }
  30.         return $link;
  31.     }
  32.     /**
  33.      * 修改评论分页链接
  34.      * @param string $result
  35.      * @return string
  36.      */
  37.     function comment_page_link_format( $result ){
  38.         // From hello-world.html/comment-page-1#comments to hello-world/comment-page-1.html#comments
  39.         if( strpos( $result, ‘.html/’ ) !== false ){
  40.             $result = preg_replace( ‘=([^/]+)(.html)/comment-page-([09]{1,})=’, “$1/comment-page-$3$2” ,$result );
  41.         }
  42.         return $result;
  43.     }
  44.     /**
  45.      * 为新的链接格式增加重定向规则,移除原始分页链接的重定向规则,防止重复收录
  46.      *
  47.      * 访问原始链接将返回404
  48.      * @param array $rules
  49.      * @return array
  50.      */
  51.     function pagelink_rewrite_rules( $rules ){
  52.         foreach ($rules as $rule => $rewrite) {
  53.             if ( $rule == ‘([^/]+).html(/[09]+)?/?$’ || $rule == ‘([^/]+).html/comment-page-([09]{1,})/?$’ ) {
  54.                 unset($rules[$rule]);
  55.             }
  56.         }
  57.         $new_rule[ $this->post_rule ] = ‘index.php?name=$matches[1]&page=$matches[3]’;
  58.         $new_rule[ $this->comment_rule ] = ‘index.php?name=$matches[1]&cpage=$matches[2]’;
  59.         return $new_rule + $rules;
  60.     }
  61.     /**
  62.      * 禁止WordPress将页面分页链接跳转到原来的格式
  63.      * @param string $redirect_url
  64.      * @param string $requested_url
  65.      * @return bool
  66.      */
  67.     function cancel_redirect_for_paged_posts( $redirect_url, $requested_url ){
  68.         global $wp_query;
  69.         if( is_single() && $wp_query->get( ‘page’ ) > 1 ){
  70.             return false;
  71.         }
  72.         return true;
  73.     }
  74. }
  75. new Rewrite_Inner_Page_Links();

本代码适用于固定链接格式为/archives/%postname%.html,若固定格式不同需要作相应修改,修改方法见下文。

若固定链接格式为/%postname%.html,请修改规则,将

  1. $this->post_rule = ‘archives/([^/]+)(‘.$this->separator.'([09]+))?.html/?$’;
  2. $this->comment_rule = ‘archives/([^/]+)/comment-page-([09]{1,}).html(\#[^\s])?$’;

改为

  1. $this->post_rule = ‘([^/]+)(‘.$this->separator.'([09]+))?.html/?$’;
  2. $this->comment_rule = ‘([^/]+)/comment-page-([09]{1,}).html(\#[^\s])?$’;

本文介绍的方法演示了修改固定链接格式、并添加新Rewrite rules的方法,适用于其他情况。例如修改custom post type的固定链接,不同的是用哪个filter来修改链接输出格式。

@wordpress大学 # WORDPRESS 用.HTML作为URL后缀时的分页链接问题

文章字数统计:3663 | 百度已收录

  |  pc蛋蛋幸运28群/WordPress  


微部落博客编辑整理发布,如有侵犯您的版权,请提供相关版权证明,博主将立即删除。
·博客大全  博客网址之家  博客导航  来路IP首页展示!   ·免费收录  ·免费推广你的博客   114.vprol.com
如果本文对您有用就 打个赏吧微信 OR 支付宝 扫描二维码
pay_weixin     pay_weixin
金额随意,您的支持是我的动力~

草根站长,博客导航,博客大全,博客网站,增加网站流量
回复 取消

欢迎评论发言,灌水及广告评论将被定期删除!

仅有 1 条评论

  1. 明月登楼 2016-3-27 20:14回复
    值得收藏的代码!有空可以试试看!