修正WordPress 设置伪静态后文章分页链接

知更鸟 2017年10月28日15:06:32WordPress14110.5K阅读模式

我们通常将WordPress固定链接设为/%postname%.html或者/%post_id%.html,可以让页面看起来像静态页,但当文章有分页时,分页链接会变得奇怪,比如:文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

/morning-paper-news.html/3文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

/132.html/2文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

html既然是后缀就应该一直在最后,来自solagirl的《用.html作为url后缀时的分页链接问题》一文,为我们提供了解决办法。文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

不过原代码只提供了/%postname%.html的修改方法。文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

本文提供一下/%post_id%.html的修改方法。文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

修正WordPress 设置伪静态后文章分页链接文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

将下面代码添加到当前主题 functions.php中:文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

// 适合/%post_id%.html分页链接修正
class Rewrite_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;
	}
	function flush_rewrite_rules(){
		flush_rewrite_rules();
	}
	// 修改post分页链接的格式
	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 ){
		foreach ($rules as $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将页面分页链接跳转到原来的格式
	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_id();

提示:添加代码后,需要保存一下固定链接设置。文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

之后再次打开文章分页链接,会变成类似的:文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

/morning-paper-news/page-2.html文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

/132/page-2.html文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

注:上述代码并没有评论分页的链接修正,本人无此刚需未做研究。文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html


应网友要求补一个:/%category%/%post_id%.html格式的文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

貌似这种格式也经常有人问,这里就提供一下修改方法:文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

将上述代码中第36行:文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

$new_rule['([0-9]+)('.$this->separator.'([0-9]+))?.html/?$'] = 'index.php?p=$matches[1]&page=$matches[3]';

改为:文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

$new_rule['[^/]+/([0-9]+)('.$this->separator.'([0-9]+))?.html/?$'] = 'index.php?p=$matches[1]&page=$matches[3]';

只是加了个[^/]+/文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

最后分页形式是:文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

分类名称/132/page-2.html文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

添加修改上述代码后,不要忘记到后台保存一下固定链接设置,否则不会生效!文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html


其它固定链接形式,需要安装rewrite rules inspector插件查看链接正则写法并修改上述代码。文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

有主题用户问,为什么不集成到主题中?原因很简单,大家的固定链接形式各不相同,这段代码没有通用性,而且还是有很多BUG,如自定义分类法文章就无法使用,添加上述代码后,可能文章都无法打开...文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

附:适合/%postname%.html链接形式原代码:

展开收缩
文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html
// 修复.html分页链接
class Rewrite_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 ); // for inner pages
			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;
	}
	function flush_rewrite_rules(){
		flush_rewrite_rules();
	}
    /**
	* 修改post分页链接的格式
	* @param string $link
	* @param int $number
	* @return string
	*/
	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;
	}
	/**
	* 修改评论分页链接
	* @param string $result
	* @return string
	*/
	function comment_page_link_format( $result ){
		// From hello-world.html/comment-page-1#comments to hello-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
	* @param array $rules
	* @return array
	*/
	function pagelink_rewrite_rules( $rules ){
		foreach ($rules as $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将页面分页链接跳转到原来的格式
	* @param string $redirect_url
	* @param string $requested_url
	* @return bool
	*/
	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();

文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

上述代码会可能会与No category parents插件冲突,解决办法:文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

打开No category parents插件no-category-parents.php文件,在大约54行找到:文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

  1. //if ( ! isset( $rules['(.+?)-cat/?$'] ) ) { // have to comment this in order to refresh the rules
  2.     global $wp_rewrite;
  3.     $wp_rewrite->flush_rules();
  4. //}

去掉注释,改为:文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

  1. if ( ! isset( $rules['(.+?)-cat/?$'] ) ) { // have to comment this in order to refresh the rules
  2.     global $wp_rewrite;
  3.     $wp_rewrite->flush_rules();
  4. }

不过还真不知道这句默认注释掉的用处,经测试未发现有什么问题。文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

如果不想用rewrite rules inspector插件查看链接规则,可以将下面代码添加到主题functions.php中,之后打开固定链接设置页面会看到链接规则。文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

add_filter( 'rewrite_rules_array', 'show_rewrite_rules' ); 
function show_rewrite_rules( $rules ) {
  echo nl2br( var_export( $rules, true ) );
  die;
}

 文章源自知更鸟-https://zmingcx.com/pseudo-static-article-page-links.html

weinxin
版权声明
本站原创文章转载请注明文章出处及链接,谢谢合作!
评论  141  访客  137  作者  4
    • 暮辞
      暮辞 0

      // 为新的链接格式增加重定向规则,移除原始分页链接的重定向规则,防止重复收录
      这个功能无效 还是301了原来的 /132.html/2 这种链接

      • 台庄资讯
        台庄资讯 5

        分页后404咋办。。。 :!:

        • learn
          learn 0

          过来学习一下下 :mrgreen:

          • 是大V
            是大V 0

            学习一下

            • 夏天烤洋芋
              夏天烤洋芋 2

              感谢分享,解决了我好多年前就纠结的问题

              • 老蛤蟆
                老蛤蟆 0

                看看是不是我想要的结果,感谢~~~

                • CPS广告
                  CPS广告 0

                  感谢分享!!!

                  • admin
                    admin 1

                    看看隐藏内容啊

                    • 七号文库
                      七号文库 1

                      正需要看一下

                      • .
                        . 0

                        谢谢分享

                        • 筱全
                          筱全 0

                          /%category%/%year%/%second%%post_id%.html
                          应该如何修改?

                          • 阳光树儿
                            阳光树儿 0

                            学习了,谢谢

                            • 12234234
                              12234234 0

                              来学习下

                              • SKY8G网
                                SKY8G网 0

                                网站不错呀反应太别快,支持一下

                                • 雨竹叶枫
                                  雨竹叶枫 1

                                  设置分页后,访问分页内容,统计代码不统计PV数量。

                                  • bugstack
                                    bugstack 0

                                    学习下

                                    • Harry
                                      Harry 3

                                      学习下

                                      • 陀螺世界
                                        陀螺世界 0

                                        学习了

                                        • 大王
                                          大王 0

                                          谢谢分享

                                          • PureDesin
                                            PureDesin 0

                                            感谢分享

                                            • z
                                              z 0

                                              感谢分享

                                              • Yephy
                                                Yephy 0

                                                看看怎么解决插件冲突的

                                                • 大鱼
                                                  大鱼 0

                                                  学习高手

                                                  • 翠花
                                                    翠花 0

                                                    我来学习下!

                                                    • 大V看看
                                                      大V看看 0

                                                      好不容易搞定分页,结果却出现/132.html/2,这篇文章真的帮了大忙了。

                                                      • Stone.Sam
                                                        Stone.Sam 1

                                                        请教,/%category%/%post_id%.html
                                                        我这个多了一层。

                                                          • 知更鸟
                                                            知更鸟

                                                            @ Stone.Sam 修改方法已加文章中

                                                              • Stone.Sam
                                                                Stone.Sam 1

                                                                @ 知更鸟 很感谢您啊,第一次用WP,要学习的地方还很多。

                                                                • Stone.Sam
                                                                  Stone.Sam 1

                                                                  @ 知更鸟 这个代码好像和Super Static Cache有冲突,我使用了这个代码,所有页面全部跳转首页。

                                                              • 未来
                                                                未来 0

                                                                评论分页有问题,无法查看前面的评论

                                                              匿名

                                                              发表评论

                                                              匿名网友 填写信息

                                                              :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

                                                              确定