海天无影's Blog

WordPress获取twitter,修改fetch_feed函数缓存时间

/ 23评 / 0

现在海天的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';
 }

发表评论

电子邮件地址不会被公开。