张戈博客很久很久之前转载过一篇关于博客外链跳转的方法(相关文章),后来安装了Anylink插件也就没有用到。近来清点插件时,我将Anylnk给淘汰了,换成了网上找到的给外链添加nofollow的代码。
一、原版代码
//给外部链接加上跳转,将此代码添加到wordpress主题目录的functions.php里面即可 add_filter('the_content','the_content_nofollow',999); function the_content_nofollow($content){ preg_match_all('/href="(.*?)"/',$content,$matches); if($matches){ foreach($matches[1] as $val){ if( strpos($val,home_url())===false){ $content=str_replace("href=\"$val\"", "href=\"$val\" rel=\"external nofollow\" ",$content); } } } return $content; }
代码原理也挺简单,通过匹配文章content内容,若发现存在外链,就给这个外链a标签加上 rel=”nofollow”属性。
这个代码常规博客确实可以用,但有可能导致一些特殊链接失效,比如这个代码很可能会让知更鸟主题的下载按钮无法弹出或者文章索引损坏,应该是替换过程中被破坏掉了。
针对这个问题,我对代码进行了第一个改进:
二、改进代码
//给外部链接加上跳转 add_filter('the_content','the_content_Jump',999); function the_content_Jump($content){ preg_match_all('/<a(.*?)href="(.*?)"(.*?)>/',$content,$matches); if($matches){ foreach($matches[2] as $val){ if(strpos($val,'://')!==false && strpos($val,home_url())===false){ $content=str_replace("href=\"$val\"", "href=\"".home_url()."/go/?url=$val\" ",$content); } } } return $content; }
①、加入了对常规http://或https://开头的链接判断,就能有效的绕过知更鸟主题的一些特殊链接,就因为这些特殊链接都不带http://:
strpos($val,’://’)!==false
②、2014-11-26补充:加入了对 完整a标签 判断:
preg_match_all(‘/<a(.*?)href=”(.*?)”(.*?)>/’,$content,$matches);
…
foreach($matches[2] as $val){
主要目的是为了绕过高亮代码中的一些外部链接,因为在代码中出现自己博客的跳转形式可能会破坏代码功能,比如博客分享的《百度收录查询和显示代码》,若不过滤的话,其中的百度链接将会被加上跳转,对使用者带来困惑:
偶然翻看博客旧文章,又看到了以前分享的跳转办法,觉得可以和现在的外链处理代码结合一下,或许可以相得益彰,更加完善!
详细部署步骤如下:
三、最终代码
①、新增跳转
根据以前分享的方法,在网站根目录新增一个文件夹,命名为go,并在go文件夹下新增一个index.php,内容如下:
<?php $url = $_GET['url']; Header("Location:$url"); ?>
现在用浏览器访问http://域名/go/?url=外链就能实现跳转了, 比如访问: http://zhangge.net/go/?url=http://www.baidu.com 就能跳转到百度了。
②、新增robots规则:
为了防止搜索引擎抓取这种跳转链接,我们可以在robots.txt里面新增禁止抓取/go的规则:
…以上内容略…
Disallow: /go
…以下内容略…
③、重写外链
i. 替换文章内容中的外链
在主题目录下的functions.php新增如下函数,即可将文章中的外链替换为go跳转的形式:
//给外部链接加上跳转 add_filter('the_content','the_content_Jump',999); function the_content_Jump($content){ preg_match_all('/<a(.*)href="(.*?)"(.*)>/',$content,$matches); if($matches){ foreach($matches[2] as $val){ if(strpos($val,'://')!==false && strpos($val,'nofollow')===false && strpos($val,home_url())===false){ $content=str_replace("href=\"$val\"", "href=\"".home_url()."/go/?url=$val\" ",$content); } } } return $content; }
ii. 替换评论者的链接
在主题目录下的functions.php查找是否存在修改评论链接为新窗口commentauthor函数,如果存在则如下修改第8行,将$url修改为/go/?url=$url,其实就是在前面新增一个go跳转即可,相同的道理!
//评论链接新窗口 function commentauthor($comment_ID = 0) { $url = get_comment_author_url( $comment_ID ); $author = get_comment_author( $comment_ID ); if ( empty( $url ) || 'http://' == $url ) echo $author; else echo "<a href='".home_url()."/go/?url=$url' rel='external nofollow' target='_blank' class='url'>$author</a>"; }
Ps:如果functions里面没有这个评论新窗口的函数,请自己找到评论列表输出的代码位置(可能在comments.php),然后参考修改即可(国内主题一般都会有个评论新窗口函数,自己仔细找找看)!
iii. 知更鸟副标题转载来源链接跳转
其实知更鸟的转载来源链接本身就有nofollow,不过强迫症嘛,还是继续修改下:
打开知更鸟主题目录下的includes文件夹,找到source.php文件,如下修改$reprinted所在行即可:
echo ‘⁄ 转载:’.'<a href=”‘.home_url().’/go/?url=’.$reprinted.'” rel=”external nofollow” target=”_blank”>原文链接</a>’;
看到这里,相信你应该能轻松领悟方法了吧?就是在外链链接之前加上【http://博客域名/go/?url=】即可!需要修改博客哪个位置的外链,只要找到该位置对应的主题模板,然后参考上述代码修改即可!
来自:http://zhangge.net/4683.html