いいわけブログ

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

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

      2016/02/08

前回BlogIDを取るところまでやったので、その続きです。

画像をWordPressへアップロードする

XML-RPC APIで、ローカルにある画像をサーバへ送信します。
とりあえず送信してURL取るところまでのコードです。

$imageFile = 'hoge.png';
$imagePath = '/images/' . $imageFile;

$image = file_get_contents($imagePath);
$extension = pathinfo($imagePath, PATHINFO_EXTENSION);
$file = array(
    'bits' => new XML_RPC_Value($image, 'base64'),
    'name' => new XML_RPC_Value($imageFile, 'string'),
    'type' => new XML_RPC_Value('image/' .$extension, 'string'),
);
$wpFile = new XML_RPC_Value($file, 'struct');

// ファイルのアップロード
$message = new XML_RPC_Message(
    'metaWeblog.newMediaObject',
    array($blogId, $wpUserName, $wpPassword, $wpFile)
);
$wpResult = $cli->send($message);
if (!$wpResult) exit('Could not connect to the server.');
if( $wpResult->faultCode() ) exit($wpResult->faultString());

$resp = XML_RPC_decode($wpResult->value());
$uploadImageUrl = $resp['url']; //アップロードしたファイルのPath

ではコードを見ていきます。

【構造体データを作る】


XML_RPC_Message
でサーバへデータを渡すために、XML_RPC_Valueで構造体データを作ります。
blogger.getUsersBlogsでは配列でデータを渡しましたが、今回は連想配列になっていますね。

これは、XML_RPCの構造体データを作る場合は、連想配列にしなくてはいけないようです。
作成した連想配列を更に「new XML_RPC_Value($file, ‘struct’)」として構造体データにしています。

また、bitsデータの第2引数にbase64を取っていますが、これを指定するとBase64エンコードが透過的におこなわれます。

$file = array(
    'name' => new XML_RPC_Value($imageFile, 'string'),
    'bits' => new XML_RPC_Value($image, 'base64'),
    'type' => new XML_RPC_Value('image/' .$extension, 'string'),
);
$wpFile = new XML_RPC_Value($file, 'struct');

それと上記補足ですが、サーバへアップロードするだけなら、typeは必要無いですが、これが無い場合メディアの一覧にサムネイルが表示され無かったので追加しています。

【画像をアップロード(転送)】

BlogIDを取得した時と同様、XML_RPC_Messageでリクエストを作り、XML_RPC_clientsendメソッドで送信します。
また、画像の転送にはmetaWeblogAPInewMediaObjectメソッドを使います。

$message = new XML_RPC_Message(
    'metaWeblog.newMediaObject',
    array($blogId, $wpUserName, $wpPassword, $wpFile)
);
$wpResult = $cli->send($message);

【アップロードした画像のURLを取得】

画像を転送したら、これもBlogID取得時と同様に、レスポンスをXML_RPC_decodeで変換し、URLを取得します。

$resp = XML_RPC_decode($wpResult->value());
$uploadImageUrl = $resp['url']; //アップロードしたファイルのPath

WordPressへ記事を投稿する

最後に先ほどアップロードした画像を新しい記事に載せて投稿します。

以下コードとなります。

$title = 'XML-RPC テスト'; //タイトルを設定
$categories = array( //複数カテゴリを設定
    new XML_RPC_Value('カテゴリ1', 'string'),
    new XML_RPC_Value('カテゴリ2', 'string')
);
$description = <<< EOF 
<p>Test Post</p>
<img src="{$uploadImageUrl}">
EOF;

$wpContent = 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(0, 'boolean'); // 0だと下書き状態でPOST

// 新しい記事の投稿
$wpMessage = new XML_RPC_Message('metaWeblog.newPost',
    array($blogId, $wpUserName, $wpPassword, $wpContent, $publish)
); 
$wpResult = $cli->send($wpMessage);

if (!$wpResult) exit('Could not connect to the server.');

if ($wpResult->faultCode()) exit($wpResult->faultString());

$postId = XML_RPC_decode($wpResult->value()); // 必要であれば戻り値のPostIDを保存

コードを見ていきます。

【投稿データを作る】

記事に必要なデータを、XML_RPC_Valueで作ります。
今回作成する記事はタイトル、本文、カテゴリ、投稿日時のみですが他にも、descriptionmt_keywords(タグ)、custom_fields(カスタムフィールド)、wp_slug(スラッグ)などを設定できるようです。

$wpContent = new XML_RPC_Value(
    array(
        'title' =&gt; new XML_RPC_Value($title, 'string'),
        'categories' =&gt; new XML_RPC_Value($categories, 'array'),
        'description' =&gt; new XML_RPC_Value($description, 'string'),
        'dateCreated' =&gt; new XML_RPC_Value(time(), 'dateTime.iso8601')
    ),
    'struct'
);

【記事を下書き状態で投稿】

記事データを作ったので、次は投稿を行うのですが、このまま投稿すると公開状態で投稿されます。
なので、投稿を一度確認したいので、下書き状態で保存することにします。
XML_RPC_Messageで投稿データを配列で渡していますが、配列データの5番目の配列($publish)がステータスとなっています。
これは「$publish = new XML_RPC_Value(0, ‘boolean’);」でfaluse(0)をXML_RPCデータでセットしています。

$publish = new XML_RPC_Value(0, 'boolean'); // 0だと下書き状態でPOST

// 新しい記事の投稿
$wpMessage = new XML_RPC_Message('metaWeblog.newPost',
    array($blogId, $wpUserName, $wpPassword, $wpContent, $publish)
); 
$wpResult = $cli->send($wpMessage);

【投稿したPostIDを取得】

sendメソッドで投稿完了なのですが、ローカルデータと投稿したデータを紐付けたい場合があるので、一応PostIDを取っておきます。

$postId = XML_RPC_decode($wpResult->value()); // 必要であれば戻り値のPostIDを保存

簡単にWordPressへ投稿できましたが、そもそものXML-RPCへの理解が乏しかったので、PEARライブラリのドキュメントを良く読まないとなーといった感じでした。

 - PHP, 技術 , , ,