MarsEdit で WordPress に投稿したらサクサク (バグ対応済み)

2009 年 3 月 22 日 | カテゴリー: その他

2009032201.png

watermint.org » Blog Archive » WordPressのXML-RPC投稿でHTMLタグが消えるのはlibxml2のバグ

いつもブログの編集・投稿にはMarsEditというソフトを使っているんですが、最近、投稿するとHTMLタグがすべて消えてしまうという現象に悩まされていました。

岡崎さんの日記で MarsEdit なんて便利そうなフロントエンドがあるんだー、なんていう本題とずれたところに興味を持ってしまいました。

2.7 になってからモッサモサしません?

WordPress の標準フロントエンドが 2.7 系になってから、JavaScript がモッサモサで日記を書くモチベーションが保てなくなっていたのは結構困っていたんです。

実際使ってみたら、全然引っかかることがないだけでなく、画像はリンクを書いた時点でプレビューされたりコピーしようと思った文章が既にテキストフィールドに入っていたりと至れり尽くせり。

さくらインターネットの libxml2 は 2.7.2

うちもレンタルサーバ(さくらインターネット)なので、libxml2 の問題をどうにかしてからじゃないと手をだせないなーって思っていたんですが、ぐーぐる先生に聞いて答えが見つかるのは運がよかったです。

ちなみに phpinfo で十分なんですが、念のためヘッダーを確認。
/usr/local/include/libxml2/libxml/xmlversion.h

xml_parse( でパースする前に文字の入れ替え

WordPress patch for problamatic libxml2 version « HooFoo Blog

wordpress/wp-admin/import/blogger.php

// xmllib 2.7.0 -2.7.2 stripping leading angle brackets bug patch
if(LIBXML_DOTTED_VERSION == '2.7.0' ||
   LIBXML_DOTTED_VERSION == '2.7.1' ||
   LIBXML_DOTTED_VERSION == '2.7.2'
) {
    $xml = str_replace('<', '<', $xml);
    $xml = str_replace('>', '>', $xml);
    $xml = str_replace('&', '&', $xml);
}
// end Fix
xml_parse($parser, $xml);

wordpress/wp-includes/class-IXR.php

// xmllib 2.7.0 -2.7.2 stripping leading angle brackets bug patch
if(LIBXML_DOTTED_VERSION == '2.7.0' ||
   LIBXML_DOTTED_VERSION == '2.7.1' ||
   LIBXML_DOTTED_VERSION == '2.7.2'
) {
    $this->message = str_replace('<', '<', $this->message);
    $this->message = str_replace('>', '>', $this->message);
    $this->message = str_replace('&', '&', $this->message);
}
// end Fix
 if (!xml_parse($this->_parser, $this->message)) {

wordpress/wp-includes/rss.php

// xmllib 2.7.0 -2.7.2 stripping leading angle brackets bug patch
if(LIBXML_DOTTED_VERSION == '2.7.0' ||
   LIBXML_DOTTED_VERSION == '2.7.1' ||
   LIBXML_DOTTED_VERSION == '2.7.2'
) {
    $source = str_replace('<', '<', $source);
    $source = str_replace('>', '>', $source);
    $source = str_replace('&', '&', $source);
}
// end Fix
$status = xml_parse( $this->parser, $source );

ようするにパースする前に文字列をちょこっと変えておいてあげようという回避策でいけるみたいです。
日本語の記事でいくつか、「$xml の変更を3ファイルに挿入」するかんじで紹介してあったんですけど、違いますよね・・・?
各ファイルの変数名は違うと思うんですが。揚げ足を取りたいわけではないので気を悪くされたらごめんなさい。
# 「まちがったことは blog に書くな派」とかじゃないです。

実験投稿

この日記が無事に投稿できたら、バグ回避できたってことですよね。
<pre><code></code></pre> といった具合にタグも埋め込んでますし。
# 成功しました。

画像のアップも結構手間がかかっているので (scp でアップして lightbox タグを自前でつけている)、MarsEdit + Flickr がおいしく頂けそうなら考えてみようー。

コメントは受け付けていません。