我们通常将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;
}
本站文章大部分为原创,用于个人学习记录,可能对您有所帮助,仅供参考!







河南 郑州市 51F
看看怎么样
江苏 南京 52F
我要了
湖南 青园 53F
学习了!
山西 柳巷街道 54F
看看怎么样
湖南 青园 55F
对方对方的回到天堂
河南 郑州市 56F
感谢楼主分享
江苏 南京 57F
啊大苏打阿达
山西 柳巷街道 58F
不行啊,伪静态后在iis里面没发搞
江苏 南京 59F
试试怎么样
北京市 西城区 60F
看看怎么样
61F
看看怎么样
江苏 南京 62F
看看,挺不错的
北京市 西城区 63F
谢谢分享!!!
64F
大神,请问国外主题可以在Portfolio详情页后面加上html吗?
65F
看看怎么样
66F
怎么不显示呢
67F
学习了
北京市 西城区 68F
学习一下
江苏 南京 69F
看看怎么样
山西 柳巷街道 70F
学习了,今晚试试,感谢大佬分享
江苏 南京 71F
不错。。。。
江苏 南京 72F
学习一下
河南 郑州市 73F
太好的文章
74F
正疑惑这个问题呢,感谢~~
江苏 南京 75F
看看是不是
76F
看看怎么解决
江苏 南京 77F
看看
78F
看看怎么样
河南 郑州市 79F
感谢楼主分享
江苏 南京 80F
感谢分享
山西 柳巷街道 81F
第三方打分大师傅似的发的
82F
/%category%/%post_id%.html 这个分页代码怎么修改啊
83F
我要了
84F
tygfyggg服服服通过
江苏 南京 85F
谢谢大佬
江苏 南京 86F
这个问题遇到了 研究一下
江苏 南京 87F
1231艾萨2大
88F
看看
浙江 杭州 89F
学习了
江苏 南京 90F
很不错的教程
江苏 南京 91F
看看怎么解决冲突
山西 柳巷街道 92F
谢谢。。。。。。。
93F
我来看秘籍
北京市 西城区 94F
fafae aegrge ewagerga 二哥
北京市 西城区 95F
学习了
江苏 南京 96F
看看怎么样
山西 柳巷街道 97F
弄了没效果,尴尬。。。/%post_id%.html 的额
山西 柳巷街道 98F
正需要!!!!
山西 柳巷街道 99F
试一试
河南 郑州市 100F
请问一下,现在是不是行能改了。我改完链接还是这样的/%postname%.html/2