前回、newPostを使用してXML-RPCで投稿しましたが、今回はeditPostでXML-RPCから編集します。
投稿と同じく「wp.xmlrpc.php」を使用しますが、editPostがありませんので、newPostをコピーしてfunctionを作ります。
public function editPost(array $data, $wp_post_id=null) { $content = array(); // 公開ステータス (publish|pending|draft|private|static|object|attachment|inherit|future) if (isset($data['post_status']) && ($post_status = $data['post_status'])) { $content['post_status'] = new XML_RPC_Value($post_status, 'string'); } // タイトル if (isset($data['post_title']) && ($post_title = $data['post_title'])) { $content['post_title'] = new XML_RPC_Value($post_title, 'string'); } else { return array( 'error' => 'タイトル(post_title)が設定されていません。' ); } // 内容 if (isset($data['post_content']) && ($post_content = $data['post_content'])) { $content['post_content'] = new XML_RPC_Value($post_content, 'string'); } (略) $wp_id = new XML_RPC_Value($wp_post_id, 'int'); $message = new XML_RPC_Message( 'wp.editPost', array($this->blog_id, $this->user, $this->password, $wp_id, $content) ); return $this->sendXMLRPC($message); }
途中、省略していますが、newPostから必要な部分をコピーして下さい。
newPostの返り値はWordpressのPost_idになるので、これをDB等に保存しておきます。editPostの時にpost_idを渡して、更新します。
基本はこれでOKですが、カスタムフィールドを同じように更新すると同じKeyで何個もフィールドが登録されてしまいます。
これを回避するにはgetPostで投稿済み記事の内容を取得してカスタムフィールドのIDを取得し、更新時にIDを付加したKeyで更新します。
getPost部分
/** * 記事取得 */ public function getPost($wp_post_id=null) { $wp_id = new XML_RPC_Value($wp_post_id, 'int'); $message = new XML_RPC_Message( 'wp.getPost', array($this->blog_id, $this->user, $this->password, $wp_id) ); return $this->sendXMLRPC($message); }
editPostのカスタムフィールド部分
// カスタムフィールド if (isset($data['custom_fields']) && ($custom_fields = $data['custom_fields'])) { $content['custom_fields'] = array(); foreach($custom_fields as $field) { $content['custom_fields'][] = new XML_RPC_Value( array( 'id' => new XML_RPC_Value($field['id'], 'string'), 'key' => new XML_RPC_Value($field['key'], 'string'), 'value' => new XML_RPC_Value($field['value'], 'string') ), 'struct' ); } $content['custom_fields'] = new XML_RPC_Value($content['custom_fields'], 'struct'); }
投稿側は
App::import('Vendor', 'wpxmlrpc', array('file'=>'wp.xmlrpc.php')); $host = WordPressのホスト; $user = ユーザー名; $password = パスワード; $endpoint = xmlrpcまでのURL; $wp = new wpXMLRPC($endpoint, $host, $user, $password); // データ取得 $res = $wp->getPost('WordpressのID'); //$res['custom_fields']にカスタムフィールドの内容が入っている (略) // 変更内容を投稿 (略) $data = array( 'custom_fields' => array( array('id'=>カスタムフィールドのID, 'key'=>キー, 'value'=>内容), array('id'=>カスタムフィールドのID, 'key'=>キー, 'value'=>内容), array('id'=>カスタムフィールドのID, 'key'=>キー, 'value'=>内容) ) ); $wp->editPost($data, 'WordpressのID');
こんな感じで更新するとカスタムフィールドが重複しないで更新できる。
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)