XML-RPCとPHPでWordPressに投稿する

WordPressにPHPにより投稿するプログラムをつくる方法について解説します。PHPで投稿するにはXML-RPCという仕組みを利用します。XMLファイルをWordPressに送ることで、記事を投稿します。このXML-RPCにはPHPのライブラリであるXML_RPCを使用します。

XML_RPCのダウンロードはこちら

WordPressとXML-RPC通信を行う際にルールが必要です。このルールについては以下のページに書かれています。

XML-RPC WordPressのCodex日本語版はこちら

日本語版は一部抜けている場所があるので、その場合は英語版を読みましょう。

XML-RPC WordPressのCordex英語版はこちら

WordPressへの接続

はじめにWordPressにログインする必要があります。そのために「wp.getUsersBlogs」を使用します。用法を以下にまとめます。

wp.getUsersBlogs

ブログID、ブログ名、ブログURLなどのブログ情報を取得できます。

入力:

string ユーザー名、string パスワード

出力:

array
   struct
      string blogid
      string blogName
      string url
      string xmlrpc
      bool isAdmin

では使ってみましょう。以下のようにプログラムを組みましょう。

<?php
	require_once("XML/RPC.php");

	$c = new XML_RPC_client("/xmlrpc.php", "XXXX.com", 80);
	
	$username = new XML_RPC_Value( 'User', 'string' );
	$passwd = new XML_RPC_Value( 'PassWord', 'string' );

	$message = new XML_RPC_Message('wp.getUsersBlogs',array($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");
?>

required_onceでRPC.phpを読み込みます。はじめにWordPressに接続するため、XML_RPC_clientを使用します。ここのXXXX.comにあなたのサイトドメインを指定しましょう。/xmlrpc.phpと80は固定なので、そのままでOKです。

次に、WordPressにログインします。User,PassWordにWordPressにログインする際のユーザー名とパスワードを記入します。これらの値をXMLにする必要があるので、XML_RPC_Valueで変換します。今回は構文が$userと$passwdにおいてstringを指定しているので、stringを指定します。XML_RPC_Messageにより送信するための文章を作成します。今回はwp.getUsersBlogsで、値は$usernameと$passwdです。

最後にWordPressにメッセージを送信します。$c->send($message)で送信されます。結果は戻り値$resultで知ることができます。if文でうまくいかなかったら終わるようにしています。

戻り値はXML_RPC_decodeでデコードして知ることができます。今回はarrayでブログ情報が順に入っています。そして、structにブログIDなどの情報が入っています。ブログはたいてい一つしかないでしょうから、$blogs[0][“blogid”]によりブログIDを取得しています。

WordPressへの記事投稿

ではWordPressへ記事を投稿しましょう。記事の投稿には「wp.newPost」を使用します。

wp.newPost

WordPressに記事を投稿します。渡すパラメタは以下の通りです。

データ型 記号 意味
int blogid ブログID、型は整数型
string username ログインの際のユーザー名
string password ログインの際のパスワード
struct content 記事の内容構造体

blogid、username,passwordは接続の際に取得した値と使用した値です。ここでの問題は構造体contentです。このcontentに記事の内容が入ります。

content構造体

記事の内容を記述します。

データ型 記号 意味
string post_type
string post_status 下書き、レビュー待ちの設定です。
string post_title 記事のタイトルです。
int post_author 記事の著者です。著者IDを入れて指定します。
string post_excerpt 記事の抜粋です。
string post_content 記事の内容です。htmlで記述します。
datetime post_date 記事投稿の時間です。
string post_format
string post_name スラッグ(URLにつくやつ)です。
string post_password 記事を見る際のパスワードです。
string comment_status
string ping_status
int sticky
int post_thumbnail アイキャッチ画像に使用する画像を選択します。画像IDを指定します。
int post_parent
array custom_fields カスタムフィールドの指定です。
struct terms IDによるタグ、カテゴリの設定です。
struct terms_names 名前によるタグ、カテゴリの設定です。
struct enclosure

では使用してみましょう。

$categories=array(new XML_RPC_Value('カテゴリ名','string'));
$tags=array(new XML_RPC_Value('タグ1','string'),
		new XML_RPC_Value('タグ2','string'));
$terms=array(
		'category'=> new XML_RPC_Value($categories,'array'),
		'post_tag'=> new XML_RPC_Value($tags,'array')
		);
$content = new XML_RPC_Value(
	array(
		'post_title' => new XML_RPC_Value('タイトル', 'string'),
		'post_content' => new XML_RPC_Value('<p>コンテンツ</p>', 'string'),
		'post_name' => new XML_RPC_Value('slug','string'),
		'terms_names' => new XML_RPC_Value($terms,'struct'),
		'post_date' => new XML_RPC_Value(time(), 'dateTime'),
		'post_excerpt' => new XML_RPC_Value('ここに抜粋', 'string'),
		'post_status' => new XML_RPC_Value('publish','string'),
	),'struct');
$message = new XML_RPC_Message('wp.newPost',
			array($blog_id, $username, $passwd, $content));
$result = $c->send($message);
if(!$result){
	exit('Could not connect to the server.');
} else if( $result->faultCode() ){
	exit($result->faultString());
}

はじめの$categoriesと$tagsにstring型でカテゴリとタグを指定します。そして、$termsにarray型で保存します。そして、$contentにタイトル、コンテンツ、スラッグなどの情報を記述します。最後に、XML_RPC_Messageでwp.newPostのメッセージを作成し、sendでサーバーに送信します。成功すると、戻り値に記事IDが記憶されます。

著者:安井 真人(やすい まさと)