您的位置:首页 > 其它

做一个WordPress的Picasa插件

2009-12-20 11:10 169 查看
一直想为我的博客加上相册功能(这样我照的相片才有人看),但始终没有实现。首先我不会在自己的博客上开发一个完整的相册功能,一来费时费力,二来
我的空间容量有限(才100M呢),放不了多少照片。那么我就需要选择一个第三方相册服务,不但容量要大,而且最好能提供开发API,这样我就比较容易把
相册功能嵌入到我的博客中。毫无悬念地,我选择了Google Picasa。

WordPress博客支持插件开发,到其官网上搜一搜,就能找到许多Picasa插件。但光从名字和描述上看很难区别那个好,我就下了一个貌似不
错的下载了,安装后发现与我的需求大相庭径。事实上人的需求总是千差万别的,别人做的插件很难刚好满足我的需要,既然我是一个受人尊敬的
Programmer,为何不自己开发一个?

主意就这样定下来了。查看了一些WordPress插件开发和Picasa API方面的文档资料,基本上知道要怎样做。 创建一个php文件,然后打开编辑,在其中加入插件头部信息:

<?php

/* Plugin Name: zzmfish’s picasa */
头部虽然只是一段注释,但是必不可少,这样WordPress才能识别你的插件。在这个头部中,我只定义了插件名字“zzmfish’s
picasa”,这将显示在管理后台的插件面板中。 WordPress的插件开发是用钩子函数(Hook)实现
,其中又分为Actions和Filters两类。在我做的这个插件中只用到Filter钩子。
Filters是用来对从数据库取出或将要存储到数据库中的数据进行处理的一类钩子函数。以这个Picasa插件为例,WordPress可以允许用户自
定义页面,这些页面信息(主要包括链接与内容)就存储在数据库中,而我现在想添加一个相册页面,就需要用到定义两个Filter来处理从数据库取出的数
据,分别添加相册链接与相册内容到相应的数据结构中。

注册第一个Filter钩子:

define(’ZZMPICASA_PAGE_ID’, 9999);
function add_to_pages($pages){

$style = ($_GET['page_id'] == ZZMPICASA_PAGE_ID) ? ‘current_page_item’ : ‘page_item page-item-2′;

$pages = “<li class=’$style’><a href=’/wp/?page_id=” . ZZMPICASA_PAGE_ID . “‘>相册</a></li>” . $pages;

return $pages;

}

add_filter(’wp_list_pages’, ‘add_to_pages’, 10, 1);
最后一句的意思是注册一个Filter钩子,使在生成页面链接列表之后(wp_list_pages)调用add_to_pages函数,优先级为10,参数为1个。add_to_pages函数很简单,就是把相册链接添加到页面列表中,然后返回。每个页面都需要有一个ID,我定义相册页面的ID为 “9999”,根据这个ID不可能从数据库中页面内容。没关系,我们可以再注册一个Filter钩子来处理这个问题:

class MyPost {

var $post_content;

var $post_title;

}

function add_to_posts($posts) {

if ($_GET['page_id'] == ZZMPICASA_PAGE_ID) {

$mypost = new MyPost();

$mypost->post_title = ‘我的照片’;

$mypost->post_content = get_albumlist_html();

$posts = array($mypost);

}

return $posts;

}

add_filter(’the_posts’, ‘add_to_posts’, 10, 1);
注册一个钩子,使在生成页面内容的时候(the_posts)的时候调用add_to_posts函数,如果是相册页面,就对数据进行处理。返回结果必须
是对象数组,因此我定义了一个MyPost类,然后返回一个MyPost对象。这样写做显然很不好,但除此之外我不知道怎样创建一个具有
post_title和post_content属性的对象。页面标题为“我的照片”,内容由get_albumlist_html函数生成:

function get_albumlist_html() {

$feedurl = ‘http://picasaweb.google.com/data/feed/api/user/zzmguitar’;

$xml = file_get_contents($feedurl);

$doc = new DOMDocument();

$doc->loadXML($xml);

$entrylist = $doc->getElementsByTagName(’entry’);

$html = ‘<center>’;

foreach ($entrylist as $entry) {

$id = $entry->getElementsByTagNameNS(’http://schemas.google.com/photos/2007′, ‘id’)->item(0)->nodeValue;

$name = $entry->getElementsByTagNameNS(’http://schemas.google.com/photos/2007′, ‘name’)->item(0)->nodeValue;

$html .= “<div style=’width:400px;font-family:arial,sans-serif;font-size:13px;’><div><embed type=’application/x-shockwave-flash’ src=’http://picasaweb.google.com/s/c/bin/slideshow.swf’ width=’400′ height=’267′ flashvars=’host=picasaweb.google.com&captions=1&hl=zh_CN&feat=flashalbum&noautoplay=1&RGB=0×000000&feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2Fzzmguitar%2Falbumid%2F$id%3Falt%3Drss%26kind%3Dphoto%26hl%3Dzh_CN’ pluginspage=’http://www.macromedia.com/go/getflashplayer’></embed></div><span style=’float:left;’><a href=’http://picasaweb.google.com/zzmguitar/$name?feat=flashalbum’ style=’color:#3964c2′>查看全部</a></span></div>”;

}

$html .= “</center>”;

return $html;

}
我在picasa注册的用户名叫zzmguitar,那么从http://picasaweb.google.com/data/feed/api
/user/zzmguitar可以拿到XML格式的相册目录数据,解析XML中的数据,然后你就会得到你想要的。最后以Flash的形式展示每个相册,
点击开始播放,点击链接进入相册。

加上最后一行

?>
值得注意的是,“<?php”之前和“?>”之后不可有任何字符(包括空白字符),因为这会导致在WordPress发送HTTP头部之前发出内容,使后面发送头部失败!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: