WordPressでmetaWeblog.newPostに日付を渡して叩くと正常に動作しない件

 カラパー!(挨拶)

 現在、WordPressに対してmetaWeblog.newPost APIを叩いて記事を書き込むプログラムを作っているのですが、どうもWordPressのmetaWeblog.newPostおよびeditPostには、「dateCreatedを設定すると内部でエラーが発生する」および「categoiesに1つのカテゴリのみを指定した場合、カテゴリが設定されない」という不具合がある模様です。

dateCreatedを設定すると内部でエラーが発生する

WordPress › Support » posting via xmlrpc metaWeblog -> error in xmlrpc.php

 この記事に書かれているのですが、APIの dateCreated を解釈する部分にバグがあり、本来であれば日付をIXR_Date型に変換してからgetIso()するべきところを変換する前に呼び出してしまっているため、エラーが発生して投稿に失敗します。
 この記事は2.2時代のものらしいのですが、同様のエラーは2.5.1でも発生します。テストしてないんじゃないのかこれ。

 対処として、xmlrpc.phpの該当部分を以下の様に修正しました。

1306行以降(mw_newPost)、および1575行以降(mw_editPost)

// Do some timestamp voodoo
if ( !empty( $content_struct['date_created_gmt'] ) ) {
	$content_struct['date_created_gmt']  = new IXR_Date($content_struct['date_created_gmt']);
	$dateCreated = str_replace( 'Z', '', $content_struct['date_created_gmt']->getIso() ) . 'Z';
} elseif ( !empty( $content_struct['dateCreated']) ) {
	$content_struct['dateCreated']  = new IXR_Date($content_struct['dateCreated']);
	$dateCreated = $content_struct['dateCreated']->getIso();
}

 なお現在の実装では、IXR_Date型にタイムゾーンを含んだiso8601形式の文字列を渡した場合、タイムゾーンは処理されていないようです。なので、APIにdateCreatedを渡す場合は、JSTではなくGMTを渡した方が良いと思われます。
 ちなみにIXR_DateはUNIXタイムスタンプも値として受け取れるので、dateCreatedにtime()関数の戻り値を入れることが可能です。他のブログではどうなんだろう。

categoiesに1つのカテゴリのみを指定した場合、カテゴリが設定されない

 これは仕様上の動作だと思うのですが、XMLRPC::Liteを使ってcategoriesにカテゴリ名称文字列を1つだけ入れてAPIに渡すと、カテゴリが設定されません。これは、metaWeblog.newPostのcategoriesのデータ型が文字列の配列であることに起因するものと思われます。
 この現象を回避するため、xmlrpc.phpに以下の修正を行いました。

1324行以降(mw_newPost)、および1533行以降(mw_editPost)

if (is_array($catnames)) {
	foreach ($catnames as $cat) {
		$post_category[] = get_cat_ID($cat);
	}
} else {
	$post_category[] = get_cat_ID($catnames);
}

1 thought on “WordPressでmetaWeblog.newPostに日付を渡して叩くと正常に動作しない件

  1. ピンバック: Websites tagged "metaweblog" on Postsaver

コメントを残す

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