WordPressにXML-RPCで投稿する2

前回、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');

こんな感じで更新するとカスタムフィールドが重複しないで更新できる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)