いいわけブログ

ガジェット・スニーカー、時々テックな情報お伝えするブログ

PHPでXML-RPCを使ってWordPressに画像を含めた記事を投稿する方法 〜 その1

      2016/02/08

WordPressに外部サーバなどから投稿できないかな?と思い、「そういえばXML-RPC APIがあったなぁ」なんと事を思い出したので、少し調べて見ました。

XML-RPCの仕様については下記参照
XML-RPC 仕様書

今回はPHPのPEARライブラリを使ってみます。

まずはPEARのXML_RPCパッケージをインストールします。

pear install XML_RPC

詳しい使い方はXML_RPCのドキュメントを見てください。

BlogIDを取得する

では実際にコードを書いていきたいと思います。
まず記事を投稿する前に、投稿したいWordpressのBlogIDを取得します。

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

$hostName = 'wp.example.com';
$xmlrpcPath = '/xmlrpc.php';
$appKey = '任意文字列(空で良い)'; 
$user = 'ユーザー名';
$passwd ='パスワード';

$wpAppKey = new XML_RPC_Value($appKey, 'string');
$wpUserName = new XML_RPC_Value( $user, 'string');
$wpPassword = new XML_RPC_Value( $passwd, 'string');

$message = new XML_RPC_Message(
    'blogger.getUsersBlogs',
    array($wpAppKey, $wpUserName, $wpPassword)
);

$cli = new XML_RPC_client($xmlrpcPath, $hostName, 80);
$wpResult = $cli->send($message);

// 戻り値0はI/Oエラー
if (!$wpResult) exit('I/O Error. '.$cli->errstring);

// faultCode(),戻り値0以外は失敗
if ($wpResult->faultCode()) exit($wpResult->faultString());

$blogs = XML_RPC_decode($wpResult->value());
$blogId = new XML_RPC_Value($blogs[0]['blogid'], 'string');

コード内容を説明しておきますね、若干コードが前後します。

【サーバに送信するリクエストの作成】

まずWordPressに接続するため、XML_RPC_Messageインスタンスを作ります。

$message = new XML_RPC_Message(
    'blogger.getUsersBlogs',
    array($wpAppKey, $wpUserName, $wpPassword)
);

XML_RPC_Messageはサーバに起動したいメソッドとパラメータを送信し、戻り値としてXML_RPC_Responseを受け取ります。
今はBlogIDが欲しいのでBlogger APIgetUsersBlogsメソッドを設定します。

第2引数には、接続に必要なユーザー情報を配列で渡していますが、これは予めXML_RPC_Valueメソッドで作成します。

$wpAppKey = new XML_RPC_Value($appKey, 'string');
$wpUserName = new XML_RPC_Value( $user, 'string');
$wpPassword = new XML_RPC_Value( $passwd, 'string');

先頭のappkeyBlogger APIで利用するもののようですが、WordPressでは必要無いので任意の文字列または空で良いみたいです。
XML_RPC_Valueの第2引数にはXML_RPCの型を入れます。

【サーバへリクエストを送信する】

先ほど作成したXML_RPC_Messageインスタンスを、XML_RPC_clientsendメソッドに渡して、サーバへ送信します。

$wpResult = $cli->send($message);

【エラー確認】

sendメソッドは戻り値としてXML_RPC_Responseを返しますが、戻り値0の場合はI/Oエラーです。

// 戻り値0はI/Oエラー
if (!$wpResult) exit('I/O Error. '.$cli->errstring);

次に、faultCodeメソッドで判定します。0以外の戻り値は失敗となります。

// faultCode(),戻り値0以外は失敗
if ($wpResult->faultCode()) exit($wpResult->faultString());

【取得したデータをPHPデータ型に変換】

valueメソッドでサーバから返されたXML_RPCオブジェクトを受け取り、さらにXML_RPC_decodeでPHPのネイティブデータ型に変換します。
逆に、PHPのネイティブデータ型をXML_RPCオブジェクト型に変換する場合は、XML_RPC_encodeを使用します。

$blogs = XML_RPC_decode($wpResult->value());
$blogId = new XML_RPC_Value($blogs[0]['blogid'], 'string');

これで変換されたデータからBlogIDを取得できますが、このあとの投稿時に利用するので、XML_RPC_Valueでカプセル化しておきます。

ちょっと前置きが長くなったので、続きはその2に書きます。

 - PHP, 技術 , , ,