RESTなWebサービスを作ってみる
投稿の更新
投稿の更新/取得/削除は、1つのプログラム(edit.php)で行います。更新/取得/削除の判断は、HTTPのメソッド(PUT/GET/DELETE)で行います。
edit.phpの中から、前半部分(更新の処理)を抜き出すと、リスト5のようになります。まず、HTTPのメソッドを、変数「$method」に読み込みます(10行目)。その値が「PUT」である時には、データベースから投稿を読み込み(22行目)、内容を更新して(25/26行目)、保存しなおします(27行目)。そして、保存の結果をXMLにします(28~31行目)。
--------------------------------------------------------------------------------
【リスト5】 投稿の更新(edit.php)
// WordPressのAPIを使えるようにする
define('WP_USE_THEMES', false);
require('../wp-config.php');
// subfunc.phpを組み込む
require('subfunc.php');
// 結果用のXMLを生成
$responseXML = create_response_xml();
// HTTPのメソッドを調べる
$method = $_SERVER['REQUEST_METHOD'];
// PUTメソッド(投稿の更新)の場合は、
// リクエストとともに送信されたXMLを読み込む
if ($method == 'PUT') {
$requestXML = fetch_request_xml();
}
// URLから投稿のIDを得る
preg_match('/edit\.php\/(\d*)$/', $_SERVER['REQUEST_URI'], $matches);
$id = intval($matches[1]);
// 投稿の編集(PUTメソッドの場合)
if ($method == 'PUT') {
// 投稿を読み込む
$post = get_post($id);
if ($post) {
// 投稿のタイトルと内容を更新し、結果をXMLにする
$post->post_title = $requestXML->post_title;
$post->post_content = $requestXML->post_content;
/if (wp_update_post($post)) {
$responseXML->addChild('status', 1);
$responseXML->addChild('post_id', $id);
$responseXML->addChild('post_title', $post->post_title);
$responseXML->addChild('post_content', $post->post_content);
}
// 投稿の更新に失敗した場合
else {
$responseXML->addChild('status', 0);
}
}
// 投稿を読み込めなかった場合
else {
$responseXML->addChild('status', 0);
}
}
--------------------------------------------------------------------------------
投稿の取得/削除
投稿の取得/削除も、edit.phpで行います(リスト6)。投稿の更新と同様に、メソッドに応じて必要な処理を行い、その結果をXMLでクライアントに返すようにします。
図3は、このプログラムと連動するためのクライアントの例です。「ID」の欄に投稿のIDを入力し、「投稿を読み込む」のボタンをクリックすると、GETメソッドで通信を行って投稿を取得し、「タイトル」「本文」の欄で編集できるようにしています。
また、タイトルなどを編集して「送信」ボタンをクリックすると、PUTメソッドで通信を行い、WordPressの投稿を更新します。
--------------------------------------------------------------------------------
【リスト6】 投稿の取得/削除
// 投稿の取得(GETメソッドの場合)
elseif ($method == 'GET') {
// 投稿を読み込む
$post = get_post($id);
if ($post) {
// 読み込んだ投稿の情報をXMLにする
$responseXML->addChild('status', 1);
$responseXML->addChild('post_id', $id);
$responseXML->addChild('post_title', $post->post_title);
$responseXML->addChild('post_content', $post->post_content);
}
// 投稿を読み込めなかった場合
else {
$responseXML->addChild('status', 0);
}
}
// 投稿の削除(DELETEメソッドの場合)
elseif ($method == 'DELETE') {
// 投稿を削除し、結果をXMLで返す
$result = wp_delete_post($id);
$responseXML->addChild('status', $result ? 1 : 0);
}
header('Content-Type: text/xml; charset=UTF-8');
print $responseXML->asXML();
?>
--------------------------------------------------------------------------------
以上で、今回の目的である、WordPressの投稿を追加/編集/削除するWebサービスが完成しました。サンプル・プログラムのソースコードは、こちらからダウンロードできるようにしておきました。
今回で当連載は終了ですが、いかがだったでしょうか。Webサービスの理解にお役に立てば幸いです。
【参考文献】
『RESTful Webサービス』(Leonard Richardson、Sam Ruby著、山本 陽平監修、株式会社クイープ翻訳)(オライリー・ジャパン発行、発行年:2007)