no-self-ping多站点版(半原创)
2011年08月03日 分类目录 :wordpress资源 3
wordpress有一个功能是当有网站引用博客上的日志时,会有一个TrackBack Ping返回来,但是默认它并不会判断是否是自己博客引用旧有日志。在这种情况下,即使是自己引用自己的日志也会返回一条记录,虽然没多大影响,但是这个看起来就让人不爽。于是就有了相关插件来屏蔽这种情况。当然,它就是no-self-ping了。
时间回到1天前,由于前几天写的日志均有引用过去的日志,因此在评论中都返回了一条条ping记录,这让我感到疑惑,我早已启用了这个no-self-ping插件,为什么还会返回记录呢?一番思索,我的目光集中到了自定义域名身上。由于自定义域名并非是真正绑定博客,而只是一种类似于重定向的方式,因此,对于wordpress的一些function来说,它所认识的仍然只是原来的域名。例如:我的博客原地址是http://wangqige.com,绑定的自定义域名则是http://wangqige.com,但是无论是getOption(“home”)还是其他和url相关的方法,它们所识别到的都只是前者。
当有了这个想法之后,我就去查看了一下no-self-ping的源代码:
function no_self_ping( &$links ) {
$home = get_option( 'home' );
foreach ( $links as $l => $link )
if ( 0 === strpos( $link, $home ) )
unset($links[$l]);
}
add_action( 'pre_ping', 'no_self_ping' );
果然和我猜想的一样(当然,也多亏了甲洲的帮助),当确定这点之后,就开始寻找解决方案了。由于想到实现自定义域名是使用了插件的结果,因此,极有可能自定义域名相关内容储存在了数据库中。但是,由于我并没有菊子曰空间的数据库的访问权限,因此就尝试性通过其他渠道来确认这个猜测。起先想直接看插件的源代码,可是空间使用的相关插件是收费版的,网上下不到。不过幸运的是,下载到了一个相同功能的免费版插件,经过对它800多行代码的仔细查看(虽然看不大懂),果然,里面有和数据库打交道的部分。于是,再通过甲洲一个确定,确实是存储在数据库中了,而且有专门的一张表,知道了这点之后就开始想具体实现方法了。
至于这过程不多做说明,总之是花了我4、5个小时(没学过PHP、对wordpress开发一窍不通的我啊),费劲千辛万苦,冒着搞瘫空间的风险,经过十几次的调试,总算是最后做出来了。而且经过多种情况的测试,也确实起到作用了。(测试的情况有:插件启用状态下未绑定自定义域名的博客发引用自已日志的日志、绑定自定义域名的博客发同时引用自己日志以及空间内其他博客日志的日志)。这才放下心来,这可是我第一个能够正常使用的插件(当然并非完全原创,只是在前人基础上进行修改)。
function no_self_ping( &$links ) {
global $wpdb;
$home = get_option( 'home' );
$blogid = get_blog_id_from_url($home,$path='/');
if(is_muiltsite() && null != ($wpdb -> get_row($wpdb->prepare("SELECT * FROM {$wpdb->wp_domain_mapping} WHERE blog_id = $blogid)")))){
$home = $wpdb -> get_result("SELECT domain FROM {$wpdb->wp_domain_mapping} WHERE blog_id = $blogid");
}
/*如果你的空间使用的是wordpress-mu-domain-mapping这个插件来实现自定义域名的话,则将上面if语句中的wp_domain_mapping改为dmtable即可*/
foreach ( $links as $l => $link )
if ( 0 === strpos( $link, $home ) )
unset($links[$l]);
}
add_action( 'pre_ping', 'no_self_ping' );
由于我是业余爱好者,所以写的代码可能比较烂,别介意。这里其实有个疑惑,if语句判断中的is_muiltsite()是否可以去掉,毕竟这张表也就只有多站点模式下才可能会存在的。唉~不纠结了,考虑的周全点总归是好的。而且从理论上来说,当用&&时,第一个条件不满足的话就不用再去考虑第二个和数据库打交道的条件了,也许能提高点效率吧(真的么?)。























