乌徒帮技术范WordPressWordPress开发 › WordPress固定链接形式以.html结尾时,解决其他URL末尾丢失.html的情况

WordPress固定链接形式以.html结尾时,解决其他URL末尾丢失.html的情况

分类:WordPress开发

在我们一些开发中,常常想让网站的UTL末尾以.html结尾,以此来让自己的网站显得更有吸引力。但实际上,我并不认为这是最好的,如果网站的内容非常出色,我相信使用什么形式的URL都不会影响网站的用户体验。好了,不管这些,我们来就题目而说。

读本文之前,你最好读过《WordPress中固定链接URL形式与SEO控制插件的公布》一文,以了解我为何要写这篇文章。

当你的wordpress固定链接形式采用.html结束时(当然,你有的时候采用.htm或者采用.xxx),你会发现除了文章页面的URL是以.html结尾外,其他页面都不是,这会让你感到失望。本文就来帮你解决这个问题。我们开发一个插件来解决它。

首先,我们先让独立文章页的URL带上.html

add_action('init', 'permalink_end_width_html', -1);
function permalink_end_width_html() {
?? ?global $wp_rewrite;
?? ?if(!strpos($wp_rewrite->get_page_permastruct(),'.html')){
?? ??? ?$wp_rewrite->page_structure = $wp_rewrite->page_structure . '.html';
?? ?}
}

add_filter('user_trailingslashit', 'no_page_slash',66,2);
function no_page_slash($string, $type){
?? global $wp_rewrite;
?? ?if ($wp_rewrite->using_permalinks() && $wp_rewrite->use_trailing_slashes==true && $type == 'page'){
?? ??? ?return untrailingslashit($string);
? }else{
?? return $string;
? }
}

这段代码中有两个部分,第一部分用以修改页面的固定链接形式(permstructure),为每一个链接添加.html。这一步会让你的用户在访问带有.html的页面URL时,仍然可以访问到页面。

但如果仅仅这样的话,你会发现,前台HTML源代码中,所有页面的URL都是不带.html的,因此,你需要继续使用第二部分来让这些链接可用。

其次,让你的分类、标签、归档页的URL末尾也带上.html

add_filter('category_link', 'archives_link_end_with_html', 10, 2);
add_filter('tag_link', 'archives_link_end_with_html', 10, 2);
add_filter('day_link', 'archives_link_end_with_html', 10, 2);
add_filter('month_link', 'archives_link_end_with_html', 10, 2);
add_filter('year_link', 'archives_link_end_with_html', 10, 2);
function archives_link_end_with_html($link){
?? ?return rtrim($link, '/') . '.html';
}

是的,使用上面的短短的代码,就可以让你的分类、标签、归档(年月日)页URL采用.html的形式。关于作者、文章形式等,我们就不去挖掘了,毕竟这几个页面是最重要的。

但这段代码只是让你的前台页面中它们的链接有了变化,实际上,我们还没有写重写规则,这些新的URL还是不能访问的。重写我们和下面的合并到一起,最后来讲。

再次,让你的翻页也采用.html的形式

这一点在其他几乎所有的教程中都没有讲,即使你使用了某些方法,但如果你的页面开始翻页,就会发现URL变成了...html/page/123的样子,.html跑到了中间。实际上,我们有办法来解决这个问题。

function permalink_end_width_html_pagenum_change($pagenum_link){
?? ?$current_pagenum = get_query_var('paged');
?? ?$pagenum_link = str_replace('.html','',$pagenum_link);
?? ?if(is_home() && is_front_page()){
?? ??? ?$pagenum_link = str_replace('page/','page-',$pagenum_link);
?? ??? ?$pagenum_link = str_replace('page-'.$current_pagenum.'/','',$pagenum_link);
?? ?}else{
?? ??? ?$pagenum_link = str_replace('/page/','/page-',$pagenum_link);
?? ??? ?$pagenum_link = str_replace('/page-'.$current_pagenum,'',$pagenum_link);
?? ?}
?? ?return $pagenum_link.'.html';
}
function permalink_end_width_html_pagenum_change_filter(){
?? ?add_filter('get_pagenum_link','permalink_end_width_html_pagenum_change');
}
add_action('init','permalink_end_width_html_pagenum_change_filter');

因为大部分翻页功能都会使用get_pagenum_link函数来最终获取翻页的链接,因此,我们利用这个HOOK来修改了翻页按钮的链接。

需要注意的是:如果你不是使用get_pagenum_link函数来获取翻页链接,那么这段代码将失效,你需要自己研究(当然,这段代码给了你极大的参考价值)。

最后,将新的重写规则告诉wordpress,让这些新的链接都是可用的

虽然上面大部分可以帮助我们解决URL的显示形式,但还有一个问题是,即使这些链接是可以被访问到的,但你还得保证,访问到后它们还能正常工作,而不是返回404页面。所以,我们必须向wordpress增加重写规则。

add_filter('category_rewrite_rules', 'permalink_end_width_html_rewrite', 3);
add_filter('tag_rewrite_rules', 'permalink_end_width_html_rewrite', 3);
add_filter('date_rewrite_rules', 'permalink_end_width_html_rewrite', 3);
function permalink_end_width_html_rewrite($rules){
??? foreach ($rules as $key => $value) {
??????? $newrules[str_replace('/?', '.html', $key)] = $value;
??????? $newrules[str_replace('/page/?([0-9]{1,})/?', '/page-?([0-9]{1,})\.html', $key)] = $value;
??? }
??? return $newrules;
}

// 对首页的分页进行一个重写
add_filter( 'rewrite_rules_array','permalink_end_width_html_home_rewrite_rules' );
function permalink_end_width_html_home_rewrite_rules( $rules ){
?? ?$newrules = array();
?? ?$newrules['^page-([0-9]{1,})\.html$'] = 'index.php?paged=$matches[1]';
?? ?return $newrules + $rules;
}

好了,通过上面这些代码,我们要实现的效果就可以实现了。

为了防止你编程时头痛,我自己写好了插件,你可以下载测试:插件下载

然而还有一个问题,你可能仍然发现某些情况下它们会失效。请你自觉的向我反馈这些问题,让我可以将它改进,以让更多的朋友从中受惠。

填写个人信息,赶快回复吧!