カラパー!(挨拶)
現在、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); }
ピンバック: Websites tagged "metaweblog" on Postsaver