乌徒帮技术范WordPressWordPress内核 › WordPress修改固定链接形式为/post/%post_id%.html形式后,日期、作者页面前面带post

WordPress修改固定链接形式为/post/%post_id%.html形式后,日期、作者页面前面带post

分类:WordPress内核,WordPress开发 标签:,,,,,,

在乌徒帮修改了固定链接形式之后,把形式修改为/post/%post_id%/%postname%.html的形式,但是在这之后出现了一个问题,就算日期、作者页面的URL前面多了一个post,例如/post/author/frustigor,/post/date/2014/04,这就很奇怪了,非常不好看,也没有必要。我们想要的结果三/author/name和/date/year/month的形式。怎么来修理呢?这篇文章告诉你答案。

1.你必须了解的事

我们需要先了解这些事实:1.你必须通过编写wordpress相关的php程序才能解决这个问题;2.你必须懂,这个问题关系着两个东西,一个是链接,例如“2014年3月”这个边侧栏里面的链接必须修改为链接到不带post的URL,另外一个是重写,你得让wordpress知道这个URL是用来调用月份的归档栏目的。

这两个问题可是比较难懂的,你要是对wordpress的开发一窍不通,就直接往下拖,如果你对实现原理比较感兴趣,就慢慢往下看。

2.如何修改链接,使点击链接进入我们想要的URL

这个其实没有那么难,非常简单。wordpress里面有一些hook,可以直接实现这个效果,主要是year_link、month_link、day_link、author_link。怎么用呢?

add_filter('author_link','archive_rewrite_link', 99, 2);
add_filter('day_link','archive_rewrite_link', 99, 2);
add_filter('month_link','archive_rewrite_link', 99, 2);
add_filter('year_link','archive_rewrite_link', 99, 2);
function archive_rewrite_link($link){
	global $wp_rewrite;
	$front = ltrim($wp_rewrite->front,'/');
	$link = str_replace_first($front,'',$link);
	return $link;
}

上面的str_replace_first是我自己写的一个函数,往下拖,在全部代码里面可以看到。非常简洁的一段代码,刷新看看,是不是这些链接都修改了。不过不要高兴的太早,链接是修改过来了,但是不要高兴的太早,是不是看到404了,对的,wordpress还根本不知道你已经修改过链接了。

3.为wordpress增加重写规则,让修改后的链接可以被正常访问

在wordpress里面有个叫rewrtie的全局类,这个类超级厉害,决定了你当前访问的URL会显示什么内容。如果你去看别人写的有关这方面的文章,绝对会吓死你,里面的逻辑非常复杂。不过,不用担心,我们这里给一个极其简单的代码就可以实现。

add_filter('author_rewrite_rules','archive_rewrite_rules',99);
add_filter('date_rewrite_rules','archive_rewrite_rules',99);
function archive_rewrite_rules($rules){
	global $wp_rewrite;
	$front = ltrim($wp_rewrite->front,'/');
    foreach($rules as $key => $value){
        $newrules[str_replace_first($front,'',$key)] = $value;
    }
    return $newrules;
}

有没有发现,比前面一段代码还短。其实道理也很简单,在URL被解析之前,我们通过修改全局类$wp_rewrite变量,即可实现我们的目的。(这种方法非常投机取巧,因为对于wordpress本身而言,数据库里面的重写规则没有变。不过,这有什么关系呢?我们可以实现自己的效果就好了。)

4.完整的代码

如果你是小白,把下面的代码拷贝到你的主题目录中的functions.php文件中,注意,一定要放在<?php ?>里面哦。

老规矩,回复才能阅读完整代码。

[reply4read]

// 替换字符串中第一次出现的子串
if(!function_exists('str_replace_first')):
function str_replace_first($find,$replace,$string){
	$position = strpos($string,$find);
	if($position !== false){
		$length = strlen($find); 
		$string = substr_replace($string,$replace,$position,$length);
		return $string;
	}else{
		return false;
	}
}
endif;

// 首先,修改网页里面的链接
add_filter('author_link','archive_rewrite_link', 99, 2);
add_filter('day_link','archive_rewrite_link', 99, 2);
add_filter('month_link','archive_rewrite_link', 99, 2);
add_filter('year_link','archive_rewrite_link', 99, 2);
function archive_rewrite_link($link){
	global $wp_rewrite;
	$front = ltrim($wp_rewrite->front,'/');
	$link = str_replace_first($front,'',$link);
	return $link;
}

// 接着,修改重写规则
add_filter('author_rewrite_rules','archive_rewrite_rules',99);
add_filter('date_rewrite_rules','archive_rewrite_rules',99);
function archive_rewrite_rules($rules){
	global $wp_rewrite;
	$front = ltrim($wp_rewrite->front,'/');
    foreach($rules as $key => $value){
        $newrules[str_replace_first($front,'',$key)] = $value;
    }
    return $newrules;
}

[/reply4read]

这里也给了不少有关URL的思路,例如今后你可以通过修改$wp_rewrite来快速实现修改author页面的前缀了,例如你可以把你的作者页面修改为/user/user_id的形式,是不是很酷。

已有7条评论 快速评论
  1. 矢左 #5749楼 2015/04/04 17:05:42 回复

    这个很有用啊!!!!

  2. ssn #5734楼 回复给@5654楼 2015/03/30 17:09:58 回复

    嗯,我想看看

  3. smarthome #5654楼 2015/02/03 15:43:33 回复

    不错不错

  4. 否子戈 #4376楼 回复给@4375楼 2014/09/22 23:40:26 回复

    对SEO已经不予理会了,只要正常收录即可

  5. Toner chip #4375楼 2014/09/19 14:09:57 回复

    层级这么多了,对SEO好吗?

  6. 否子戈 #4314楼 回复给@4313楼 2014/04/17 23:01:44 回复

    一看就是为了抓代码的

  7. loblov #4313楼 2014/04/17 20:30:57 回复

    不错不错

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