自动获得Favicon
最进增加了一个Links页面。传统的做法,每个链接前面都是一个统一的icon,在个性张扬的今天实在是显得有点落伍。无意中逛到Shawn的Links页,发现他页面中的每个链接前面的icon都是目标站点的favicon,这个感觉很不错啊~在FireBug的帮助下,我成功实现了这个功能。预览可参见本站的Links页面。
基本的设计思想是:获得每个链接的地址,提取出域名部分,提交给Google,Google返回的就是一个16×16的PNG图片,对于没有被Google缓存favicon的网站,会得到一个小地球的图标,就像这样
获取图标的网址为: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为基础进行修改,其他版本请参考修改。
- 打开wp-include目录下的bookmark-template.php文件,将其中的两个函数复制出来,放到一个新的文件中,原文件关闭,修改在新文件中进行;
- 编辑_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;
- 编辑wp_list_bookmarks函数,将其中所有的”_walk_bookmarks“替换为新函数”my_bookmarks“。三次替换,分别在228行、239行和242行;
- 将wp_list_bookmarks改名,比如my_list_bookmarks;
- 检查一下代码,确保替换无误并且没有误删任何字符后,将两个函数复制到主题目录下的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模式下,导致引号的转义出现错误,现在已经修改好了。
不错哦,持续关注中,呵呵
@圣兽麒麟
哈哈~等你的新博上线~
这个技巧很实用!
很不錯的hack,學習
我是用js获取的哈~
@Leeiio
)
嗯~之前我也想着用js,后来想想js太复杂了不好,还是决定用php了~(其实是懒得再改js再压缩再删除gz缓存文件…
很实用的功能,正好准备做友情链接页面。
Good, 这个功能很靠谱
很不错,正好用的上
照你说的做了,可是不行耶,在后台编辑保存function.php后报错,能否指导下~
@万戈
提示什么错误呢?后台保存不成功多半跟php文件语法错误有关,你不妨仔细检查一下。
@Bronco
改了好几次,都还是不行,能否发一份修改好的函数去我邮箱呀,先谢咯~
真是太感谢了,已经实现了这个效果,不介意我转载下吧?
@万戈
没问题,遵守by-nc-sa并且注明出处就好~
哦!台强大了!呵呵……
依样画葫芦,Facicon能显示,链接名看不到,
使用之后网站打开就一片空白.
为什么我的郁闷 去掉www 图标能显示,加上就没了
@HzlzH
试了一下,貌似用hzlzh获得的favicon也不是你网站用的那个嘛~
可能对于Google来说,带www的和不带的算两个域名。
我就是看了这个种调用,才从新做的favicon,昨天传上去的。
你看到的不带www的 favicon 就是以前的。
我就奇怪GG为什么不收我带www的图标
————-
PS:所以代码里最好加上双重判断,防止我这样的情况
看来google还有好多东西可以发掘啊!
原来是如此实现的,好,试试看~
楼主,请教您一下, 假如网站没有favicon 会返回一个地球, 就像你文中说的那样,
现在我想显示各个网站的favicon, 没有favicon的 显示我默认的favicon(不是地球)
我该如何判断 google返回的favicon 不是地球呢? 谢谢楼主解答,楼主方便的话,还请楼主将答案发到 [email protected] 邮箱 这样我能及时的看到,谢谢您了
[...] 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 [...]
[...] 转自:http://heybronco.net/tech/wordpress/get-favicon-automatically/ 相关文章: 合并wordpress帐号 [...]
[...] Bronco原创:http://heybronco.net/tech/wordpress/get-favicon-automatically/ [...]
[...] Bronco [...]
[...] Bronco原创:http://heybronco.net/tech/wordpress/get-favicon-automatically/ [...]