本文只是一种构想,笔者认为是可行的,只是没有时间,也没有精力去实现它。
标题所提到的两个博客系统,代表着两类博客系统:
1. WordPress: 即 WordPress 博客系统,动态博客系统的代表。
2. Octopress: 通过静态博客生成器(Static blog generator)生成静态博客的典型代表,博客文章、页面等最终以静态页面的形式输出。还有许多其它的静态博客生成器,例如:Jekyll (Ruby),ruhoh (Ruby),Pelican (Python),JBake (Java)等。
WordPress 的优点很多,我特别喜欢就是其丰富的客户端,在 Windows 下可以使用 Windows Live Writer 来发布文章,在手机上也可以使用基于 Android 或者 iOS 的 WordPress 客户端,可以方便的管理文章、评论等。
这点上静态博客生成器(如Octopress)就比较劣势了。这些系统都需要安装一个构建环境,来将博客源文件转化成静态博客文件。通常,这个构建环境需要安装在本地,显然这在手机上暂时是很难实现的,这就限制了发布文章的终端。当然,经过笔者的摸索,也的确实现了一种可以通过多种终端发布 Octopress 的方式,但过程是比较复杂的,需要极好的耐心和一定的技术。
WordPress 运行时需要 Web 服务器、PHP 运行环境、MySQL 数据库,内容动态解析。而 Octopress 之类的博客运行时仅仅需要 Web 服务器处理静态内容,因此具有更好的运行效率。
静态博客生成器主要的消耗在发布文章时“页面生成”过程,而这个过程每次发布仅仅是“一次性”的。
按照这篇文章介绍的方法,笔者查看了一下一个刚刚安装好的 WordPress 的查询语句统计情况。结果相当惊人:在独立“文章”每次执行约 27 个 SQL 语句,在“页面”每次执行约 30 个 SQL 语句。
可能正是基于效率上的考虑,一些极客们才会选择静态博客吧。
如果能结合 WordPress 操作上的简单方便和静态博客的高效,我们就能得到一个比较完美的博客解决方案。
笔者的构想就是直接利用 WordPress 的客户端来发布静态博客。
WordPress 使用了 XML-RPC (XML远程过程调用)接口,目前支持 Blogger API,metaWeblog API,以及 Movable Type API.。并且在 Movable Type API 的基础上做了一些扩展,形成了一个新的 API,叫着 WordPress API。
WordPress 的客户端(PC,Android版,iOS版)基本都是根据这些 API 规范来开发的,所有的调用都通过 XML-RPC 进行的,其服务端文件是 xmlrpc.php。在浏览器中直接调用会返回
XML-RPC server accepts POST requests only.说明这是一个 XML-RPC server。
这里我们将思路反过来。
如果要利用现成的 WordPress 客户端来发布文章,只需要写一个实现了 WordPress API 的 XML-RPC 服务端即可。也就是说我们需要仿造一个 WordPress 的 XML-RPC Server,实现 WordPress API 里定义的每个方法,这样客户端就可以像操作 WordPress 一样操作我们编写的 XML-RPC Server,XML-RPC Server 再执行静态博客生成器里的各种指令。
拿 Octopress 博客来举几个例子:
1. wp.newPost : WordPress 将通过 xmlrpc 调用 wp.newPost 方法来发布新文章,参数如下。
int blog_id string username string password struct content string post_type string post_status string post_title int post_author string post_excerpt string post_content datetime post_date_gmt | post_date string post_format string post_name string post_password string comment_status string ping_status bool sticky int post_thumbnail int post_parent array custom_fields struct string key string value struct terms: Taxonomy names as keys, array of term IDs as values. struct terms_names: Taxonomy names as keys, array of term names as values. struct enclosure string url int length string type在 XML-RPC Server 中,wp.newPost 方法的大致处理流程如下:
Octopress
的 rake deploy 指令生成静态博客内容并发布--- layout: post title: "${'$'}{post_title}" date: ${'$'}{post_date} comments: false categories: custom_fields['tags'] ${'$'}{post_content}2. wp.getPost : WordPress 将通过 xmlrpc 调用 wp.getPost 方法来读取执行文章,参数如下:
int blog_id string username string password int post_id array fields: Optional. List of field or meta-field names to include in response.在 XML-RPC Server 中,wp.getPost 方法的大致处理流程如下
更新(2013-05-29):
使用 Apache XML-RPC 简单的写了几个方法,通过 Android 版的 WordPress 客户端已经可以登录了。
WordPress for Android 添加博客的工作流程:
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://domain.com/xmlrpc.php?rsd" />
<?xml version="1.0" encoding="UTF-8"?><rsd version="1.0" xmlns="http://archipelago.phrasewise.com/rsd"> <service> <engineName>WordPress</engineName> <engineLink>http://wordpress.org/</engineLink> <homePageLink>http://domain.com</homePageLink> <apis> <api name="WordPress" blogID="1" preferred="true" apiLink="http://domain.com/xmlrpc.php" /> <api name="Movable Type" blogID="1" preferred="false" apiLink="http://domain.com/xmlrpc.php" /> <api name="MetaWeblog" blogID="1" preferred="false" apiLink="http://domain.com/xmlrpc.php" /> <api name="Blogger" blogID="1" preferred="false" apiLink="http://domain.com/xmlrpc.php" /> </apis> </service> </rsd>
wp.getUsersBlogs
,获取当前用户的博客列表wp.getOptions
,获取指定博客的指定选项wp.getPostFormats
,获取指定博客所支持的文章格式wp.getComments
,获取指定博客的评论Source |
|