我们通常将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分页链接修正
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();提示:添加代码后,需要保存一下固定链接设置。
之后再次打开文章分页链接,会变成类似的:
/morning-paper-news/page-2.html
/132/page-2.html
注:上述代码并没有评论分页的链接修正,本人无此刚需未做研究。
应网友要求补一个:/%category%/%post_id%.html格式的
貌似这种格式也经常有人问,这里就提供一下修改方法:
将上述代码中第36行:
$new_rule['([0-9]+)('.$this->separator.'([0-9]+))?.html/?$'] = 'index.php?p=$matches[1]&page=$matches[3]';改为:
$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链接形式原代码:
// 修复.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();上述代码会可能会与No category parents插件冲突,解决办法:
打开No category parents插件no-category-parents.php文件,在大约54行找到:
- //if ( ! isset( $rules['(.+?)-cat/?$'] ) ) { // have to comment this in order to refresh the rules
- global $wp_rewrite;
- $wp_rewrite->flush_rules();
- //}
去掉注释,改为:
- if ( ! isset( $rules['(.+?)-cat/?$'] ) ) { // have to comment this in order to refresh the rules
- global $wp_rewrite;
- $wp_rewrite->flush_rules();
- }
不过还真不知道这句默认注释掉的用处,经测试未发现有什么问题。
如果不想用rewrite rules inspector插件查看链接规则,可以将下面代码添加到主题functions.php中,之后打开固定链接设置页面会看到链接规则。
add_filter( 'rewrite_rules_array', 'show_rewrite_rules' );
function show_rewrite_rules( $rules ) {
echo nl2br( var_export( $rules, true ) );
die;
}
本站文章大部分为原创,用于个人学习记录,可能对您有所帮助,仅供参考!







1F
我个人方面还是不会在乎这些 ,所以还是算了 ,不折腾了
B1
@ BanYuner
折腾来、折腾去,发现还是没个像样的排名,真的已经懒得弄来弄去了!
江苏 南京 B2
@ 我爱动感单车网 说的有道理,总是折腾,就是没排名,呵呵
Dhaka Division 达卡 B1
@ BanYuner 我的设置了好长时间也没设置好,最后放弃了。
山西 柳巷街道 2F
这样改会对原来搜索引擎收录的分页链接有影响吗
北京市 西城区 B1
@ 站长萌萌哒 肯定是有影响的吧~
3F
文章不错感谢分享
4F
新站可以折腾,老站感觉就无所谓了,已经禁止抓取评论分页和文章分页
5F
感谢分享,很有用的方法。
6F
至今还没使用过文章分页这个功能,我个人就无需设置了
。
山西 柳巷街道 7F
不设置分页,长页面,稍微美化就行了
浙江 杭州 8F
第三方第三方
河南 郑州市 9F
看到这篇文章之后,我马上试了试,果然是这样,之前都没发现这样的问题。马上开始改。
河南 郑州市 10F
我的链接结构是 /article/%post_id%.html 改了之后,表示无效。
B1
@ 趣果网 尝试将
$new_rule[‘([0-9]
改为:
$new_rule[‘article/([0-9]+)
B2
@ 知更鸟
鸟哥的技术就是好!
11F
为什么不支持三方登录??
12F
说实话这这种分页链接挺好看的
13F
文章不错支持一下吧
山西 柳巷街道 14F
博主很赞,完善细节,追求极致,学习
15F
这个还是很有用的
16F
文章不错支持一下吧,非常喜欢
湖南 青园 17F
免费分享:空手套白狼,每30分钟赚18元,全新暴力正规项目,限时招真传弟子!
当你还在思考的时候,你的对手早就已经开始操作了!
赚钱最核心的秘密,那就是行动一定要快!狠!准!你只能从成功走向成功!
空手套白狼定义:是指花费极小的代价,获取一个丰厚的回报!
快速拜师渠道:威 3073994742 (写验证码466,加我必通过)
河南 郑州市 18F
我就是看到冲突了,只是收藏了!
其实我没有让文章分页的习惯!
山西 柳巷街道 19F
百度都已经收录了,不在变动了。
浙江 杭州 20F
山西 柳巷街道 21F
一如既往的懒啊 懒得折腾
河南 郑州市 22F
一来就看到干货,直接拿走。
23F
在『给分类目录和页面链接末尾加斜杠』这段代码的判断中加入以下条件,过滤掉文章分页链接形式即可解决冲突:
$type_of_url != ‘single_paged’
B1
@ sys OK,收到
24F
挺好的
天津市 天津 25F
支持知更鸟大大,非常牛!
26F
折腾来、折腾去、对网站排名有影响吧。
27F
我去试试~~~
江苏 南京 28F
媳妇不知道吧知道是S官方W阿W
江苏 南京 29F
谢谢分享
B1
@ 112 ss也来折腾一下
30F
也来折腾一下
浙江 杭州 31F
很少用到文章分页的!
浙江 杭州 32F
我倒是想知道如何伪静态化评论的链接,以方便又拍云的缓存!
山西 柳巷街道 33F
不错,可以使分页链接更美观,跟其它页面链接格式统一
北京市 西城区 34F
我是来看代码的
山西 柳巷街道 35F
新手一枚,这个问题看了阁下教程后完美解决了,谢谢
北京市 西城区 36F
谢谢分享,好文章
北京市 西城区 37F
折腾了老关天还是不行
浙江 杭州 38F
做个博客可真麻烦啊
江苏 南京 39F
修改了半天没用。。
江苏 南京 40F
谢谢分享
湖南 青园 41F
学习了,感谢!!!!
北京市 西城区 42F
谢谢分享
43F
感谢楼主的分析
江苏 南京 44F
不知道是哪个代码会造成冲突,所以还是回复下好
江苏 南京 45F
看看是什么好不好
江苏 南京 46F
47F
中文评论
B1
@ 123 8e08b8b4db13ca685cce333210d620ce好
山西 柳巷街道 48F
的有道理,总是折腾,就是没排名,呵呵
北京市 西城区 49F
改不改问题应该不大吧?
江苏 南京 50F
测试下评论效果。