五分钟为FBO wordpress插件制作一个365key的provider

Friends By Outline wordpress插件从v0.2起开始支持自定义内容扩展。缺省情况下,只能按照你的wordpress blog、del.icio.us和flickr的内容来生成一个outline。通过自定义内容扩展,可以很容易的导入其他内容。我把这种内容扩展叫做 provider。现在就以365key为例,看看怎么制作一个provider让你的FBO支持365key网摘。
首先,创建一个名字叫365key.php的文件。在这个文件里需要实现两个函数,一个提供一个配制信息,一个通过配制信息提取365key的内容,导入FBO。
配制信息函数类似wordpress中的配制页面函数,需要提供配制页面的内容和处理提交的信息。在这里,我们只需要得到用户的365key ID,那么这个函数就是这样的:

function b365key_option()
{
if (!empty($_POST[‘doSubmit’])) {
update_option(‘fbo_365key_id’, $_POST[‘fbo_365key_id’]);
}
?>
<p>
<label> My 365key ID:<br/>
<input type=”text” name=”fbo_365key_id”
value=”<?php echo get_option(‘fbo_365key_id’); ?>” />
</label>
</p>
<?php
}

我 们有了365key的id,就可以通过”http://www.365key.com/rss/<id>”来访问网摘,并通 过wordpress自带的MagpieRSS函数提取这个内容,再创建一个OPMLItem对象,用一个attribute array来初始化这个对象(也可以使用这个对象的AddAttribute方法添加属性),最后把这个对象插入以函数参数形式传入的OPML对象中,并 返回这个对象就可以了。这个函数如下:

function b365key_provider($obj)
{
$b365key_id = get_option(‘fbo_365key_id’);
if(!empty($b365key_id)) {
$rss = fetch_rss(‘http://www.365key.com/rss/’.$b365key_id);
foreach($rss->items as $item)
{
$item_date=date(‘Y-m-d H:i’,
strtotime($item[‘pubdate’]));
$node = new OPMLItem(array(
‘title’=>htmlspecialchars($item[‘title’], ENT_COMPAT, ‘UTF-8’),
‘type’=>’link’,
‘dateCreate’=>$item_date,
‘subject’=>$item[‘category’],
‘htmlURL’=>htmlspecialchars($item[‘link’], ENT_COMPAT, ‘UTF-8’)));
$obj->AddChild($node);
}
}
return $obj;
}

然后,我们需要分别注册这两个函数:

fbo_add_provider(‘bookmark’, ‘b365key_provider’);
fbo_add_option(‘bookmark’, ‘Bookmarks’, ‘b365key_option’);

fbo_add_provider 是用来注册内容提供函数的。第一个参数是内容的类别,这里是”bookmark”。第二个是函数名,这里是b365key_provider。 fbo_add_option是用来注册配制函数的。第一个也是内容的类别,第二个是在配制页面中显示出的title,第三个是函数名。
这样,就得到一个365key.php,也可以点击这里直接下载,将它另存为365key.php就可以了。
最后,只需要将这个php文件拷贝到FBO插件安装目录下的fbo/providers目录下就可以了(那个目录下应该已经至少有四个文件了)。
现在回到wordpress管理页面Option下的FBO页面,就可以看到:

添上365key ID,点击Update Options,你的outline中就会包含365key网摘了。是不是很容易啊。
我会抽时间写一个FBO spec的草稿,这样大家就知道填写outline内容时需要添那些属性了。目前可以参考已有的providers。

3 thoughts on “五分钟为FBO wordpress插件制作一个365key的provider

Comments are closed.