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