现在海天的BLOG有两个地方用的twitter,一个侧栏最上的那个类似公告的,还有一个就是“最新影视”栏目。昨天喷饭饭同学问海天的WordPress是怎么获取twiitter到BLOG上的,答应开完会写出来告诉他的,可是会开完后有点情况一直没有更新,晚上9点多到家,又一下看完了《阿凡达》,就拖到现在了,现在写完准备睡觉,明天要天气好还准备出去买衣服呢,呵呵。
方法其实就是修改了WordPress的fetch_feed函数的缓存时间,来定时缓存更新twitter最新内容,当然是无插件的了。
默认获得twitter内容的代码是(来自万戈同学):
<?php $feed = fetch_feed('http://twitter.com/statuses/user_timeline/htwy.rss'); $items = $feed->get_items(0,1); foreach($items as $item) { echo $item->get_description();} ?>
可是有个问题就是,并不是实时更新,说不定就要等好久才能更新。于是发现修改WordPress的fetch_feed函数的缓存时间来定时缓存更新twitter最新内容的方法,是在HZLZH那看到的,感觉很是好用,定时更新内容,并缓存了内容,感觉比对主机好一点,不需要实时去获取twitter内容,速度应该也会快一点的吧。
wordpress 的 fetch_feed() 函数,在文件wp-includes\class-feed.php的WP_Feed_Cache_Transient 类中有定义。
class WP_Feed_Cache_Transient { var $name; var $mod_name; var $lifetime = 43200; //Default lifetime in cache of 12 hours
可以看出WordPress默认的feed更新获频率是12个小时,间隔时间太长了一点,等它获取到,黄花菜都凉了。但是如果直接从源文件默认的改,那么对于版本升级,其他地方应用等都不怎么好。而现在只是需要在某一次使用时达到快速同步即可。
于是重新定义fetch_feed() 函数的更新频率在特殊使用的时候,这样即可自定义更新频率,想要实时更新就实时更新。
<?php require_once (ABSPATH . WPINC . '/class-feed.php'); $feed = new SimplePie(); $feed->set_feed_url('http://twitter.com/statuses/user_timeline/htwy.rss');//Twitter feed地址 $feed->set_file_class('WP_SimplePie_File'); $feed->set_cache_duration(600); //设置缓存时间(1200秒)即20分钟 $feed->init(); $feed->handle_content_type(); $items = $feed->get_items(0,1);//得到Feed中第一条,可自定义显示几条 foreach($items as $item) { echo $item->get_description().'From Twitter';} ?>
注意:必须在网站的根目录新建权限777,名为cache的文件夹 否则会报警告如下: Warning: ./cache/d4b45180dsdf8107740887aed7c74.spc is not writeable in 如果是国内空间请将twitter feed地址换成“http://zvproxy.appspot.com/twitter.com/statuses/user_timeline/htwy.rss”,海天自己搭建的就不公布了
缓存机制:
SimplePie检查该feed是否已经缓存:
1、如果该feed已经缓存,并且没有过期的话,就使用缓存的feed
2、如果该feed没有缓存,SimplePie就抓取该feed并缓存下来
3、如果该feed已经缓存,但是已经过期(比如上例中已经超过设置的20分钟),SimplePie就使用HTTPCG技术向feed源发送请求,询问是否有更新:如果有更新,就使用新内容并重新缓存;如果没有更新就使用缓存的内容并重新设置缓存过期时间。
当然以上缓存更新频率修改方法也可用在其他地方,比如需要调用其他网站的最新文章处。并且可以对返回的内容进行遍历来获取我们想要的内容。如标题、时间、作者等信息。
foreach($items as $item) { echo '标题: '.$item->get_title().'<br />'; //显示标题 echo '原文地址: '.$item->get_link().'<br />';//显示文章链接 echo '作者: '.$item->get_author().'<br />'; //显示作者信息 echo '发布日期: '.$item->get_date().'<br />'; //显示发布日期 echo '摘要: '.$item->get_description().'<br />'; //显示文章内容 echo $item->get_description().'From Twitter'; }