你现在使用什么工具订阅RSS的呢?google reader ? 鲜果?还是有道?有没有想过在自己的博客上增加这样一个阅读功能呢?把你订阅的RSS和大家一起分享?

如果你看了我的“超级链接”,就应该这样一个功能是很容易实现的(太复杂的东西DDBug可不会),只是我的这个“超级链接”只显示了最新的一篇文章标题,如果想显示多篇文章也是可以实现的。下面就说一说这个超级链接实现的方法,稍微扩展一下,就可以成为你的RSS阅读器。

原理

原理说起来很简单,用php对xml文件进行解析(RSS生成的就是固定格式的xml文件),这里不打算对xml文件进行解说,有兴趣的可以参考相关资料。但是如果用基本的php语句实现解析xml文件也未免有些小复杂,这个时候,就显出开源的力量了。

目前比较流行而且效率比较高的用php实现的解析RSS库有MagpieRSS 和 SimplePie 。最初我就是使用SimplePie这个库,但是后来感觉wordpress里应该带有RSS解析的功能,于是又开始阅读wordpress的源代码,终于在rss.php这个文件中找到了相关的操作。

fetch_rss、wp_rss、get_rss

原来wordpress在wp-includes\rss.php文件中已经封装了MagpieRSS(我目前使用的是wordpress2.8.6版本,不知道2.9有没有改动,过两天把2.9下载下来分析一下),又在原始的MagpieRSS上作了一些改动,比如把获取的RSS缓存到数据库中。

fetch_rss根据传递进来的feed地址返回一个MagpieRSS对象。这个函数使用起来是最灵活的。

wp_rss和get_rss的原型分别如下:

wp_rss( $url, $num_items = -1 ) 和 get_rss ($url, $num_items = 5)

这两个函数都是调用了fetch_rss,$num_items决定显示的文章数量,wp_rss函数默认显示所有输出的文章,get_rss默认显示最新的5篇文章。这两个函数使用起来虽然方便,但是太死板,不能按照自己的方式进行输出。

实现方法

在使用上面的三个函数之前,需要先把rss.php这个文件包括进来,不然会调用失败

require_once (ABSPATH . WPINC . '/rss.php');

以显示本站的rss为例,比如显示最新的2篇文章,代码如下:

require_once (ABSPATH . WPINC . '/rss.php');
wp_rss('http://domety.com/feed/',2);

就这么两行代码即可,简单否?下面将通过“超级链接”的实现过程详细解说一下fetch_rss的使用方法。

实例

使用wordpress现有的链接表,为了区分其它链接和方便管理,我新建了一个“超级链接”的链接分类(分类ID为53),然后在添加链接的时候除了网站标题和网站地址外,再把feed地址添加进去。在主题文件夹下新建一个page-superlinks.php,该文件为页面模板,内容如下:

<?php
/*
Template Name: Page Super Links
*/
get_header();
require_once (ABSPATH . WPINC . '/rss.php');
?>
<ul id="superlinks">
 <?php
 $bookmarks = get_bookmarks('category=53');
 foreach($bookmarks as $bookmark) {
  $url = $bookmark->link_rss;
  if ( $rss = fetch_rss( $url ) ) {
   $item = (array) $rss->items[0];
 ?>
 <li><div style="background:url(<?php echo $bookmark->link_url.'favicon.ico'; ?>) no-repeat left center"><span><a href="<?php echo $bookmark->link_rss; ?>" title="订阅<?php echo $rss->channel['title']; ?>">RSS</a></span><strong><a href="<?php echo $rss->channel['link']; ?>" title="访问<?php echo $rss->channel['title']; ?>"><?php echo $rss->channel['title']; ?></a></strong><br /><small><?php echo $rss->channel['description']; ?></small></div>最新文章: <a href="<?php echo $item['link']; ?>" title="阅读原文: <?php echo $item['title']; ?>"><?php echo $item['title']; ?></a></li>
 <?php }} ?>
</ul>
<div></div>
<?php
 get_footer();
?>

然后再添加一个页面,标题为“超级链接”,页面模板选择刚才新建的Page Super Links。这样就大功告成了,去添加你的相关链接就行了。

代码中首先调用了get_bookmarks(‘category=53′)来获取“超级链接”下的所有链接,然后通过foreach循环对每个链接进行相应的处理,其中就包括了对feed地址的解析,再得到解析后的第一篇文章

if ( $rss = fetch_rss( $url ) ) {
   $item = (array) $rss->items[0];

 

扩展

本例的“超级链接”只显示了每个链接的最新一篇文章

$item = (array) $rss->items[0];

以下是显示5篇文章的例子,并对常用的参数作了说明

$rss = fetch_rss($url);
if ( $rss ) {
 $rss->items = array_slice($rss->items, 0, 5);
 foreach ( (array) $rss->items as $item ) {
  echo $item['title'];   //文章标题
  echo $item['link'];   // 文章原文链接
  echo $item['pubDate'];//文章发布日期
  echo $item['description']; //文章摘要
 }
}

另外还可以显示的内容有

  • author——文章的作者
  • category——文章分类
  • comments——注解、评论

本文就写到这里,至于显示的样式,那是CSS的事情,不在本文讨论的范围。 

最后再次感慨一下开源的力量,灰常强大。

添加评论

7 条评论

  1. 1 F

    万戈

    2009-12-23 星期三 21:44

    居然还有这招,必须收藏!!!

    回复
    • DDBug

      2009-12-23 星期三 21:51

      这篇文章写得太匆忙了,我刚发现wordpress用的缓存方式有点小缺陷,等我解决了再写篇文章说明一下

      回复
      • 万戈

        2009-12-24 星期四 12:21

        恩,那就太好了,时刻关注着
        我是用google的api实现这个功能的,可以看我的留言板页面
        但是我发现有点累赘,如果WP自带的函数可以实现,那就更完美了

        回复
  2. 2 F

    vela

    2010-01-02 星期六 17:35

    博主是个代码狂人,什么都可以用代码来搞,要好好学习php和css了,落后太多了

    回复
    • DDBug

      2010-01-02 星期六 17:40

      也不算什么狂人,只是通过代码可以实现一些个性化的东西,而插件则是大众化的,可能有些功能自己根本不需要

      回复
  3. 3 F

    疾风

    2010-01-02 星期六 19:06

    牛人啊

    回复
  4. 4 F

    瘦腿

    2010-11-26 星期五 19:58

    我的rss 显示错误404 Not Found ,怎么添加rss功能呢

    回复

添加评论