专注互联网、IT行业
In: PHPer
9 十一 2009WordPress提供了XML-RPC接口使得第三方的博客写作软件(如windows live writer等)可以与之通信来发布和修改博客。我们也可以在网站上使用这个接口做一些工作,例如:在网站首页显示最新的博客、在博客之外的页面上发表博客文章、把博客与其他内容管理系统结合,等等。
一、开启XML-RPC支持
XML-RPC协议默认是未开启的,需要到WordPress管理后台的“设置–>撰写”里的“远程发布”给XML-RPC打上勾。其说明文字为:启用 WordPress,Movable Type,MetaWeblog和Blogger 的 XML-RPC发布协议。
二、获取接口的信息
我们查看博客首页的源代码,在head中可以发现类似这样的link项
1 | <link title="RSD" href="http://blog.bluesky.cn/xmlrpc.php?rsd" type="application/rsd+xml" rel="EditURI" /> |
其中的”RSD”是“Really Simple Discovery”的意思,也就是说这是一个“简单的发现博客编辑接口”的地址。我们用浏览器直接访问这个地址就可以在其返回XML中获知博客的ID(blogID,一般这个的值是“1”)以及它所支持的接口类型和接口地址。
三、API接口选择
WordPress提供了对Blogger API、metaWeblog API、Movable Type API以及其自身的WordPress API的支持。其中WordPress API最为丰富,提供了包括操作评论文章在内的各种各样的支持。Blogger API功能较少,基本上淘汰不用了;而metaWeblog API提供了常用的接口且参数比较简洁,用得较多一些。
四、例子代码
以下是使用Incutio的XML-RPC库和Blogger API发布文章的例子,其中IXR库也是Wordpress自身所用的库,可以在“wp-includes/class-IXR.php”找到。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?php $xmlrpcurl='http://blog.bluesky.cn/xmlrpc.php'; $blogid='1'; $username='admin'; $password='pass'; $postTitle='标题'; $postContent='正文内容'; // /wordpress/wp-includes/class-IXR.php require('class-IXR.php'); $client = new IXR_Client($xmlrpcurl); $params=array( '', 'blog_ID'=>$blogid, 'user_login'=>$username, 'user_pass'=>$password, 'post_content'=>'' . $postContent, 'publish'=>true ); $params=array_values($params); $client->query("blogger.newPost",$params); $response=$client->getResponse(); if ($response['faultCode']==0){ print 'Success'; } else { print 'Fail:' . $response['faultString']; } ?> |
以下是用XML-RPC for PHP库和metaWeblog接口发布文章的例子。要先下载phpxmlrpc库取出其中的xmlrpc.inc来用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php include("xmlrpc.inc"); // 这里要改成xmlrpc.inc所在的路径 $GLOBALS['xmlrpc_internalencoding'] = 'UTF-8'; define ('DOMAIN', 'blog.bluesky.cn'); // 博客的域名 define ('BLOGID', 1); // 博客ID,一般为1 define ('USER', 'admin'); // 博客登录的用户名 define ('PASSWORD', 'pass'); // 博客登录的密码 // 创建 xml-rpc client $cl = new xmlrpc_client ( "/xmlrpc.php", DOMAIN, 80); // 准备请求 $req = new xmlrpcmsg('metaWeblog.newPost'); // 逐个列出请求的参数: $req->addParam ( new xmlrpcval ( BLOGID, 'int')); // 博客ID $req->addParam ( new xmlrpcval ( USER, 'string' )); // 用户名 $req->addParam ( new xmlrpcval ( PASSWORD, 'string' )); // 密码 $struct = new xmlrpcval ( array ( "title" => new xmlrpcval ( '标题', 'string' ), // 标题 "description" => new xmlrpcval ( '正文内容', 'string'), ), "struct" ); $req->addParam ( $struct ); $req->addParam ( new xmlrpcval (1, 'int')); // 立即发布 // 发送请求 $ans = $cl->send($req); var_dump ( $ans ); ?> |
注意一定要加上:$GLOBALS['xmlrpc_internalencoding'] = ‘UTF-8′;这一句,否则不能正确处理中文。
另一段也是用phpxmlrpc库和metaWeblog接口发表文章的例子代码,该代码使用了返回类型为“phpvals”,这样可以直接用返回结果的$r->val来获取文章ID号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php include("xmlrpc.inc"); $GLOBALS['xmlrpc_internalencoding'] = 'UTF-8'; $c = new xmlrpc_client("/xmlrpc.php", "blog.bluesky.cn", 80); $content['title']="标题"; //标题 $content['description']="正文内容"; //内容 $content['mt_keywords']="标签1,标签2"; //标签 $content['wp_password']=""; //文章密码,输入后显示加密 $content['categories'] = array("分类1","分类2"); //分类名 $x = new xmlrpcmsg("metaWeblog.newPost", array(php_xmlrpc_encode("1"), //BLOG ID php_xmlrpc_encode("admin"), //用户名 php_xmlrpc_encode("pass"), //密码 php_xmlrpc_encode($content), php_xmlrpc_encode("1"))); //立即发表 $c->return_type = 'phpvals'; $r =$c->send($x); if ($r->errno=="0") echo "发表成功,文章序号为:".$r->val; else { echo "出错了"; print_r($r); } ?> |
以下是读取最新一篇文章的例子代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php include("xmlrpc.inc"); $GLOBALS['xmlrpc_internalencoding'] = 'UTF-8'; $c = new xmlrpc_client("/xmlrpc.php", "blog.bluesky.cn", 80); $msg = new xmlrpcmsg('metaWeblog.getRecentPosts', array(php_xmlrpc_encode("1"), php_xmlrpc_encode("admin"), php_xmlrpc_encode("pass"), php_xmlrpc_encode("1")) ); $res = $c->send($msg); $val = $res->value(); $val->arraymem(0)->structreset(); while (list($key, $v) = $val->arraymem(0)->structeach()) { echo "Element: $key; Type: ".$v->kindOf()."; Value:".$v->scalarval()."\n"; } ?> |
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Quisque sed felis. Aliquam sit amet felis. Mauris semper, velit semper laoreet dictum, quam diam dictum urna, nec placerat elit nisl in quam. Etiam augue pede, molestie eget, rhoncus at, convallis ut, eros. Aliquam pharetra.
5 Responses to 用XML-RPC协议读写WordPress上的文章
一米
十一月 9th, 2009 at 6:24 下午
代码太长了啊,现在没时间看啊,毕设要做翻译,呵呵,空了再来看。
南柯一梦
十一月 9th, 2009 at 11:27 下午
呵呵,这个基本上是转载,自己的代码随后放上来
blire
二月 17th, 2010 at 7:46 下午
你好,我想要用一段调用xmlrpc.php发表文章的PHP代码,你这篇文章中“用XML-RPC for PHP库和metaWeblog接口发布文章”感觉挺合适的,但是试了一下用不了,可能是我有些地方没有设置好,能不能再向你请教一下具体过程,如果这里不方便可不可以邮件联系,先谢了!
blire
二月 19th, 2010 at 3:02 上午
已解决。
南柯一梦
二月 23rd, 2010 at 4:33 下午
抱歉一直没有看到……以后又问题一定尽力解决