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

  • 酉灿
  • WordPress
  • Jul 23, 2021

我们通常将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中:


 
  1. // 适合/%post_id%.html分页链接修正
  2. class Rewrite_Inner_Page_Links_id{
  3. var $separator;
  4. function __construct(){
  5. $this->separator = '/page-';
  6. if( !is_admin() || defined( 'DOING_AJAX' ) ) :
  7. add_filter( 'wp_link_pages_link', array( $this, 'inner_page_link_format' ), 10, 2 );
  8. add_filter( 'get_comments_pagenum_link', array( $this, 'comment_page_link_format' ) );
  9. add_filter( 'redirect_canonical', array( $this, 'cancel_redirect_for_paged_posts' ), 10, 2 );
  10. endif;
  11. if( is_admin() ) :
  12. add_filter( 'rewrite_rules_array', array( $this, 'pagelink_rewrite_rules' ) );
  13. register_activation_hook( __FILE__, array( $this, 'flush_rewrite_rules' ) ) ;
  14. register_deactivation_hook( __FILE__, array( $this, 'flush_rewrite_rules' ) );
  15. endif;
  16. }
  17. function flush_rewrite_rules(){
  18. flush_rewrite_rules();
  19. }
  20. // 修改post分页链接的格式
  21. function inner_page_link_format( $link, $number ){
  22. if( $number > 1 ){
  23. if( preg_match( '%<a href=".*.html/d*"%', $link ) ){
  24. $link = preg_replace( "%(.html)/(d*)%", $this->separator."$2$1", $link );
  25. }
  26. }
  27. return $link;
  28. }
  29. // 为新的链接格式增加重定向规则,移除原始分页链接的重定向规则,防止重复收录
  30. function pagelink_rewrite_rules( $rules ){
  31. foreach ($rules as $rule => $rewrite) {
  32. if ( $rule == '([0-9]+).html(/[0-9]+)?/?$' ) {
  33. unset($rules[$rule]);
  34. }
  35. }
  36. $new_rule['([0-9]+)('.$this->separator.'([0-9]+))?.html/?$'] = 'index.php?p=$matches[1]&page=$matches[3]';
  37. return $new_rule + $rules;
  38. }
  39. // 禁止WordPress将页面分页链接跳转到原来的格式
  40. function cancel_redirect_for_paged_posts( $redirect_url, $requested_url ){
  41. global $wp_query;
  42. if( is_single() && $wp_query->get( 'page' ) > 1 ){
  43. return false;
  44. }
  45. return true;
  46. }
  47. }
  48. new Rewrite_Inner_Page_Links_id();

提示:添加代码后,需要保存一下固定链接设置。

之后再次打开文章分页链接,会变成类似的:

/morning-paper-news/page-2.html

/132/page-2.html

注:上述代码并没有评论分页的链接修正,本人无此刚需未做研究。


应网友要求补一个:/%category%/%post_id%.html格式的

貌似这种格式也经常有人问,这里就提供一下修改方法:

将上述代码中第36行:


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

改为:


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

只是加了个[^/]+/

最后分页形式是:

分类名称/132/page-2.html

添加修改上述代码后,不要忘记到后台保存一下固定链接设置,否则不会生效!


其它固定链接形式,需要安装rewrite rules inspector插件查看链接正则写法并修改上述代码。

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

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

 

 

上述代码会可能会与No category parents插件冲突,解决办法:

打开No category parents插件no-category-parents.php文件,在大约54行找到:

 
  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. //}

去掉注释,改为:

 
  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. }

不过还真不知道这句默认注释掉的用处,经测试未发现有什么问题。

如果不想用rewrite rules inspector插件查看链接规则,可以将下面代码添加到主题functions.php中,之后打开固定链接设置页面会看到链接规则。


 
  1. add_filter( 'rewrite_rules_array', 'show_rewrite_rules' );
  2. function show_rewrite_rules( $rules ) {
  3. echo nl2br( var_export( $rules, true ) );
  4. die;
  5. }

打赏