Home > Tech > Wordpress > 自动获得Favicon

自动获得Favicon

Add a comment June 7th, 2009 http://s.ibron.co/l97Byb

最进增加了一个Links页面。传统的做法,每个链接前面都是一个统一的icon,在个性张扬的今天实在是显得有点落伍。无意中逛到Shawn的Links页,发现他页面中的每个链接前面的icon都是目标站点的favicon,这个感觉很不错啊~在FireBug的帮助下,我成功实现了这个功能。预览可参见本站的Links页面。

基本的设计思想是:获得每个链接的地址,提取出域名部分,提交给Google,Google返回的就是一个16×16的PNG图片,对于没有被Google缓存favicon的网站,会得到一个小地球的图标,就像这样Example

获取图标的网址为:www.google.com/s2/favicons?domain=example.com,将example.com换成需要的域名就OK啦~至于获取链接中的域名,可以用正则表达式来实现。(话说正则表达式确实是好东西啊~~)

另外,大多数模板对于链接页面的实现都是通过调用WP的系统函数wp_list_bookmarks来完成的,而为了完成自动获取favicon需要改动函数。为了保证将来升级Wordpress本功能依然有效,故将wp_list_bookmarks以及相关的_walk_bookmarks复制到主题的function.php中,作为主题函数来使用。

以Wordpress2.7.1为基础进行修改,其他版本请参考修改。

  1. 打开wp-include目录下的bookmark-template.php文件,将其中的两个函数复制出来,放到一个新的文件中,原文件关闭,修改在新文件中进行;
  2. 编辑_walk_bookmarks函数,找到第103行,将如下的内容
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    
    if ( $bookmark->link_image != null && $show_images ) {
    	if ( strpos($bookmark->link_image, 'http') !== false )
    		$output .= "<img src="$bookmark->link_image" $alt $title />";
    	else // If it's a relative path
    		$output .= "<img src="" . get_option('siteurl') . "$bookmark->link_image" $alt $title />";
     
    	if ($show_name) $output .= $name;
    } else {
    	$output .= $name;
    }

    替换为

    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    
    if ( $show_images ) {
    	if ( $bookmark->link_image != null) {
    		if ( strpos($bookmark->link_image, 'http') !== false )
    			$output .= "<img src=\"$bookmark->link_image\" $alt $title />";
    		else // If it's a relative path
    			$output .= "<img src=\"" . get_option('siteurl') . "$bookmark->link_image\" $alt $title />";
    	} else {//否则显示网站的Favicon
    		if (preg_match('/^(https?:\/\/)?([^\/]+)/i',$the_link,$URI)) {//提取域名
    			$domains = $URI[2];
    		}else{//域名提取失败,显示默认小地球
    			$domains = "example.com";
    		}
    		$output .= "<img src=\"http://www.google.com/s2/favicons?domain=$domains\" $alt $title />";
    	}
    }

    替换完成后将_walk_bookmarks改名,例如my_bookmarks;

  3. 编辑wp_list_bookmarks函数,将其中所有的”_walk_bookmarks“替换为新函数”my_bookmarks“。三次替换,分别在228行、239行和242行;
  4. 将wp_list_bookmarks改名,比如my_list_bookmarks;
  5. 检查一下代码,确保替换无误并且没有误删任何字符后,将两个函数复制到主题目录下的function.php文件中,原来的注释可以删掉。

这样,自动获取favicon的功能就完成了。

现在,可以通过<?php my_list_bookmarks(show_images=1) ?>来生成链接列表了。当然,也可以修改主题的link.php文件,找到wp_lisk_bookmarks(…),替换为上述第二个函数,即my_list_bookmarks。注意,需要在参数中增加一项”show_images=1“。以此模板创建一个页面,就可以看到效果。

最后,可能需要对css进行一下加工,以保证img能显示在对应位置上。

Update:实在抱歉,之前编辑的时候不小心切换到Visual模式下,导致引号的转义出现错误,现在已经修改好了。

  1. June 8th, 2009 at 22:57 | #1
    Reply Quote

    不错哦,持续关注中,呵呵

  2. June 8th, 2009 at 23:02 | #2
    Reply Quote

    @圣兽麒麟
    哈哈~等你的新博上线~ :smile:

  3. June 8th, 2009 at 23:31 | #3
    Reply Quote

    这个技巧很实用!

  4. June 9th, 2009 at 09:23 | #4
    Reply Quote

    很不錯的hack,學習

  5. June 10th, 2009 at 16:29 | #5
    Reply Quote

    我是用js获取的哈~

  6. June 10th, 2009 at 17:02 | #6
    Reply Quote

    @Leeiio
    嗯~之前我也想着用js,后来想想js太复杂了不好,还是决定用php了~(其实是懒得再改js再压缩再删除gz缓存文件… :!: )

  7. June 14th, 2009 at 11:12 | #7
    Reply Quote

    很实用的功能,正好准备做友情链接页面。

  8. June 23rd, 2009 at 02:50 | #8
    Reply Quote

    Good, 这个功能很靠谱

  9. June 27th, 2009 at 06:09 | #9
    Reply Quote

    很不错,正好用的上

  10. July 6th, 2009 at 21:49 | #10
    Reply Quote

    照你说的做了,可是不行耶,在后台编辑保存function.php后报错,能否指导下~

  11. July 6th, 2009 at 23:23 | #11
    Reply Quote

    @万戈
    提示什么错误呢?后台保存不成功多半跟php文件语法错误有关,你不妨仔细检查一下。 ;-)

  12. July 7th, 2009 at 14:05 | #12
    Reply Quote

    @Bronco
    改了好几次,都还是不行,能否发一份修改好的函数去我邮箱呀,先谢咯~

  13. July 8th, 2009 at 08:43 | #13
    Reply Quote

    真是太感谢了,已经实现了这个效果,不介意我转载下吧?

  14. July 8th, 2009 at 09:58 | #14
    Reply Quote

    @万戈
    没问题,遵守by-nc-sa并且注明出处就好~ ;-)

  15. July 9th, 2009 at 09:44 | #15
    Reply Quote

    哦!台强大了!呵呵……

  16. October 28th, 2009 at 22:25 | #16
    Reply Quote

    依样画葫芦,Facicon能显示,链接名看不到,

  17. November 2nd, 2009 at 20:35 | #17
    Reply Quote

    使用之后网站打开就一片空白.

  18. December 3rd, 2009 at 17:24 | #18
    Reply Quote

    为什么我的郁闷 去掉www 图标能显示,加上就没了

  19. December 3rd, 2009 at 22:00 | #19
    Reply Quote

    @HzlzH
    试了一下,貌似用hzlzh获得的favicon也不是你网站用的那个嘛~ ;-)
    可能对于Google来说,带www的和不带的算两个域名。

  20. December 4th, 2009 at 13:02 | #20
    Reply Quote

    :mrgreen: @Bronco
    我就是看了这个种调用,才从新做的favicon,昨天传上去的。
    你看到的不带www的 favicon 就是以前的。
    我就奇怪GG为什么不收我带www的图标
    ————-
    PS:所以代码里最好加上双重判断,防止我这样的情况

  21. January 23rd, 2010 at 14:16 | #21
    Reply Quote

    看来google还有好多东西可以发掘啊!

  22. November 3rd, 2010 at 23:03 | #22
    Reply Quote

    原来是如此实现的,好,试试看~

  23. knuter
    May 4th, 2012 at 20:45 | #23
    Reply Quote

    楼主,请教您一下, 假如网站没有favicon 会返回一个地球, 就像你文中说的那样,

    现在我想显示各个网站的favicon, 没有favicon的 显示我默认的favicon(不是地球)

    我该如何判断 google返回的favicon 不是地球呢? 谢谢楼主解答,楼主方便的话,还请楼主将答案发到 [email protected] 邮箱 这样我能及时的看到,谢谢您了

  1. [...]   Bronco原创:http://heybronco.net/tech/wordpress/get-favicon-automatically/  » 转载请注明来源:Life Studio » 《获取 Favicon 服务美化友情链接》  » 本文链接地址:http://www.life-studio.cn/get-google-favicon-automatically.html  » 订阅本站:http://feed.life-studio.cn [...]

  2. [...] 转自:http://heybronco.net/tech/wordpress/get-favicon-automatically/ 相关文章: 合并wordpress帐号 [...]

  3. [...] Bronco原创:http://heybronco.net/tech/wordpress/get-favicon-automatically/ [...]

  4. [...] Bronco [...]

  5. [...] Bronco原创:http://heybronco.net/tech/wordpress/get-favicon-automatically/ [...]

Comments feed