XML-RPC を使用して、WordPress に投稿する方法です。
XML-RPC とは簡単に言うと XML を HTTP でやり取りしてリモート手続き呼び出しを行うための方法です。非常に簡単な仕様で、仕様書も短いですので興味のある方は下記サイトで仕様を確認してください。
XML-RPC Specification
XML-RPC 仕様書 (上記仕様の日本語訳)
その他の参考サイト
PEAR の XML_RPC のマニュアル
Manual :: XML_RPC
WordPress でサポートされている XML-RPC API
Blogger API
MetaWeblog API
Movable Type API
WordPress の XML-RPC API
XML-RPC wp « WordPress Codex
日本語の情報では下記サイトが見やすくまとめられています。
MovableType で使える XML-RPC API
準備
PHP で XML-RPC を使用するときに PEAR の XML_RPC を使うと非常に簡単です。下記コマンドでインストールします。
# pear install XML_RPC
WordPress が当然必要になるのですが、実際に公開しているブログでテストするのはあれなので、ローカルサーバにテスト用の WordPress をインストールしました。WordPress 2.7 では XML-RPC がデフォルトで使用できないようになっていますので、「設定」>「投稿設定」の中にある XML-RPC のチェックボックスにチェックを入れてます。これで WordPress の XML-RPC が有効になります。
ブログ情報の取得
WordPress の URL が http://example.com/wordpress/ だとすると host は example.com 、XML-RPC サーバ(xmlrpc.php)へのパスは /wordpress/xmlrpc.php となります。
ユーザ名とパスワードには WordPress に登録したユーザを指定します。appkey という項目は Blogger API で使用しますが、WordPress では使われない項目なので空白でかまいません。
記事を投稿したりするときには、blog_id が必要になるのでまず下記のようにして、blog_id を取得します。実際には blog_id の他にも URL やブログ名、ユーザの属性などが取得できます。
require_once("XML/RPC.php");
$host = "example.com";
$xmlrpc_path = "/wordpress/xmlrpc.php";
$appkey = '';
$user = 'username';
$passwd ='password';
$c = new XML_RPC_client($xmlrpc_path, $host, 80);
$appkey = new XML_RPC_Value($appkey, 'string');
$username = new XML_RPC_Value( $user, 'string' );
$passwd = new XML_RPC_Value( $passwd, 'string' );
$message = new XML_RPC_Message(
'blogger.getUsersBlogs',
array($appkey, $username, $passwd) );
$result = $c->send($message);
if( !$result ){
exit('Could not connect to the server.');
}else if( $result->faultCode() ){
exit($result->faultString());
}
$blogs = XML_RPC_decode($result->value());
$blog_id = new XML_RPC_Value($blogs[0]["blogid"], "string");
Recent Post の取得
$numbers = new XML_RPC_Value(20, "int");
$message = new XML_RPC_Message(
'metaWeblog.getRecentPosts',
array($blog_id, $username, $passwd, $numbers) );
$result = $c->send($message);
if( !$result ){
exit('Could not connect to the server.');
}else if( $result->faultCode() ){
exit($result->faultString());
}
$posts = array_map(
'array_convEnc',
XML_RPC_decode($result->value())
);
function array_convEnc($a){
if( is_array($a) ){ return array_map( 'array_convEnc', $a ); }
return mb_convert_encoding($a, mb_internal_encoding(),'UTF-8');
}
ファイルのアップロード
写真などのファイルをアップロードすることもできます。記事に写真を入れたい時には予めファイルをアップロードしておく必要があります。アップロード後に URL など取得できるのでそれを投稿する時に使用します。
$image = file_get_contents("/path/to/filename.jpg");
$file = array(
"bits" => new XML_RPC_Value($image, "base64"),
"name" => new XML_RPC_Value("filename.jpg", "string"),
);
$file = new XML_RPC_Value($file, "struct");
$message = new XML_RPC_Message(
'metaWeblog.newMediaObject',
array($blog_id, $username, $passwd, $file)
);
$result = $c->send($message);
if( !$result ){
exit('Could not connect to the server.');
}else if( $result->faultCode() ){
exit($result->faultString());
}
$resp = XML_RPC_decode($result->value());
$image_url = $resp["url"];
記事の投稿
タイトルやカテゴリ、本文、投稿日時、公開するか下書きにするかなどを指定します。
$title = 'TITLE';
$categories = array(
new XML_RPC_Value("category name1", "string"),
new XML_RPC_Value("category name2", "string")
);
$description = "ここに本文を入れます。<p>HTML も書けます</p><img src='".$image_url."'>";
$content = new XML_RPC_Value(
array(
'title' => new XML_RPC_Value($title, 'string'),
'categories' => new XML_RPC_Value($categories, 'array'),
'description' => new XML_RPC_Value($description, 'string'),
'dateCreated' => new XML_RPC_Value(time(), 'dateTime.iso8601')
),
'struct');
$publish = new XML_RPC_Value(1, "boolean");
$message = new XML_RPC_Message(
'metaWeblog.newPost',
array($blog_id, $username, $passwd, $content, $publish));
$result = $c->send($message);
if( !$result ){
exit('Could not connect to the server.');
}else if( $result->faultCode() ){
exit($result->faultString());
}
$post_id = XML_RPC_decode($result->value());
metaWeblog.newPost でカテゴリを指定するときは 配列にする必要があり、またカテゴリ名で指定しなければいけません。blogger.newPost ではタイトルやカテゴリは本文と一緒に下記のように指定します。そのときのカテゴリの指定はカテゴリID だったのでちょっとはまりました。
$content = "<title>TITLE</title><category>4</category>本文...";
関連する投稿
13 Responses to “[WordPress] XML-RPC を使用する方法”
Leave a Reply
Additional comments powered by BackType




4月 27th, 2009 at 1:31 am
はじめまして。
参考にさせていただいております。
上記のコードのように、WPに大してPostしてみたのですが、
上記の「記事の投稿」の20行の時点で、
Fatal error: Call to a member function serialize() on a non-object in C:\xampp\php\PEAR\XML\RPC.php on line 1292
と出てしまいます。
なにが原因が考えられますでしょうか?
突然の質問で申し訳ありません。
4月 27th, 2009 at 5:03 am
質問はいつでも歓迎です。
文字コードはどうなっていますか?
マルチバイト文字が入っている場合は UTF-8 でないと同様のエラーになったことがありました。
または、blog_id は正しく入っていますか?
blog_id, username, passwd などが XML_RPC_Value で入れていないと同様のエラーになりました。
require_once(”XML/RPC.php”);
$host = “example.com”;
$xmlrpc_path = “/wordpress/xmlrpc.php”;
$appkey = ”;
$user = ‘username’;
$passwd =’password’;
$c = new XML_RPC_client($xmlrpc_path, $host, 80);
$appkey = new XML_RPC_Value($appkey, ’string’);
$username = new XML_RPC_Value( $user, ’string’ );
$passwd = new XML_RPC_Value( $passwd, ’string’ );
略
$blog_id = new XML_RPC_Value($blogs[0]["blogid"], “string”);
参考になれば幸いです。
4月 27th, 2009 at 11:09 pm
お返事ありがとうございます。
文字コードはUTF-8でやろうとしています。
$blog_idをダンプすると以下のようになります。
object(XML_RPC_Value)#33 (2) {
["me"]=>
array(1) {
["string"]=>
string(1) “1″
}
["mytype"]=>
int(1)
}
これはblog_idが正しく取得できていると言うことで良いでしょうか?
4月 28th, 2009 at 4:31 am
blog_id はそれで大丈夫ですね。
var_dump($message->serialize());
としてみたらどうなりますか?
serialize すると $message の内容が XML になります。それで自分が作った $message が思った通りの XML になっているか確認できますので。
4月 29th, 2009 at 1:30 am
たびたびすみません。。。
var_dump($message->serialize());
で同じエラーが表示されます。
ちなみに私が作成しているコードは以下のようなコードなのですが、間違っていますでしょうか?
面倒をかけますが、よろしくお願いいたします。
require_once(”XML/RPC.php”);
$host = “somehost”;
$xmlrpc_path = “/pathto/xmlrpc.php”;
$appkey = ”;
$user = ‘user’;
$passwd =’password’;
$c = new XML_RPC_client($xmlrpc_path, $host, 80);
$appkey = new XML_RPC_Value($appkey, ’string’);
$username = new XML_RPC_Value( $user, ’string’ );
$passwd = new XML_RPC_Value( $passwd, ’string’ );
$message = new XML_RPC_Message(
‘blogger.getUsersBlogs’,array($appkey, $username, $passwd)
);
$result = $c->send($message);
if(!$result){
exit(’Could not connect to the server.’);
} else if( $result->faultCode() ){
exit($result->faultString());
}
$blogs = XML_RPC_decode($result->value());
$blog_id = new XML_RPC_Value($blogs[0]["blogid"], “string”);
$title = ‘TITLE’;
$categories = array(
new XML_RPC_Value(”未分類”, “string”),
);
$description = “ここに本文を入れます。HTML も書けます”;
$content = new XML_RPC_Value(
array(
‘title’ => new XML_RPC_Value($title, ’string’),
‘categories’ => new XML_RPC_Value($categories, ‘array’),
‘description’ => new XML_RPC_Value($description, ’string’),
‘dateCreated’ => new XML_RPC_Value(time(), ‘dateTime.iso8601′)
),
’struct’);
$publish = new XML_RPC_Value(1, “boolean”);
$message = new XML_RPC_Message(
‘metaWeblog.newPost’,
array($blog_id, $user, $passwd, $content, $publish)
);
$result = $c->send($message);
if(!$result){
exit(’Could not connect to the server.’);
} else if( $result->faultCode() ){
exit($result->faultString());
}
$post_id = XML_RPC_decode($result->value());
4月 29th, 2009 at 6:21 am
$message = new XML_RPC_Message(
‘metaWeblog.newPost’,
array($blog_id, $user, $passwd, $content, $publish)
);
の部分が違いますね。$user ではなく、XML_RPC_Value の $username を使ってください。これでうまくいくはずです。
4月 29th, 2009 at 3:39 pm
度々ありがとうございます!
解決しました!!
何度も答えていただいて恐縮です。
ありがとうございました。
4月 30th, 2009 at 4:48 am
うまくいったようでよかったです!
8月 4th, 2009 at 12:35 pm
[...] WordPress で XML-PRCを使用する方法 [...]
8月 9th, 2009 at 8:33 am
[...] [WordPress] XML-RPC を使用する方法 | Sun Limited Mt. WordPress が当然必要になるのですが、実際に公開しているブログでテストするのはあれなので、ローカルサーバにテスト用の WordPress をインストールしました。WordPress 2.7 では XML-RPC がデフォルトで使用できないようになっていますので、「設定」>「投稿設定」の中にある XML-RPC のチェックボックスにチェックを入れてます。これで WordPress の XML-RPC が有効になります。 [...]
11月 8th, 2009 at 11:07 pm
[...] 参考にさせていただいた記事はこちらです [WordPress] XML-RPC を使用する方法 [...]
6月 19th, 2010 at 1:13 am
おお!
投稿出来ました!すばらしい!
6月 19th, 2010 at 3:49 am
regepan さん、お役に立てたようでよかったです