Wordpressでins要素が不正な(X)HTMLに変換される
WordPressでins要素が不正な(X)HTMLに変換される不具合を見つけました。
まずは、「MyMiniCityを設置してみました」の記事をご覧ください。追記部分をins要素としてマークアップしています。投稿時には次のように入力しています。
<ins datetime="2007-12-31T09:53:40+09:00"><p><a href="http://www.trybase.com/~dengen/log/">dengenさん</a>より、<abbr title="Common Gateway Interface">CGI</abbr>を使ってMyMiniCityをブログに表示する方法が紹介されていることを教えていただきました(「<a href="http://www.h-fj.com/blog/archives/2007/12/21-111424.php">MyMiniCityはじめました - The blog of H.Fujimoto</a>」)。</p></ins>
しかし、実際に出力されているXHTMLは次のようにわけのわからないことになっています。
<p><ins datetime="2007-12-31T09:53:40+09:00">
<p><a href="http://www.trybase.com/~dengen/log/">dengenさん</a>より、<abbr title="Common Gateway Interface">CGI</abbr>を使ってMyMiniCityをブログに表示する方法が紹介されていることを教えていただきました(「<a href="http://www.h-fj.com/blog/archives/2007/12/21-111424.php">MyMiniCityはじめました - The blog of H.Fujimoto</a>」)。</p>
<p></ins></p>
元凶はWordPressによる(X)HTMLの自動整形機能です。ins要素は出現位置によってブロックレベル要素にもインライン要素にもなれる要素です。入力時にはブロックレベル要素としてのマークアップをしていますが、出力時にはp要素として整形しようとした形跡があります。p要素はブロックレベル要素を子要素として持てないので不正なXHTMLということになりますが、整形自体にも失敗しているようです。
自動整形機能は、素のテキストを含む投稿をした場合でも適当にp要素などに整形してくれるので、初心者や(X)HTMLをよくわからない他人が使う場合には便利な機能とも言えます。反面、自分でマークアップを行う人間にとってはもっともおせっかいな機能の一つです。ビジュアルエディタを無効にしてもこの機能は無効にはなりません。
この機能を無効にするためのDisable wpautopというプラグインをいれているのですが、まだどこかで整形の処理がされているようです。おそらくフィルタとして登録されていると思うので、ソースコードを探っていけば無効にするのは難しくないはずです。かなり致命的な不具合なので後で調べてみます。
コメント (5)
書き忘れてました。function wpautopはwp-includes/formatting.phpにあります。
#このテーマ、コメント周りの表示がちょっと変になってますね。
levaさん、情報をありがとうございます。
URIの記事も参考にさせていただきました :)
Contact Form 7プラグインは入れてるのですが、これも悪さをしているんですね…。
いらない機能なので、wpautop周りと一緒に調べて無効化できそうならそうしてみます。
せっかく書いていただいたのに、コメントではHTMLらしき部分が削除されるてるっぽいですね… :x
Phizeさん。
いろいろ目についちゃうと、進まないです。。(笑)。。
そうなんですよね…(笑
WordPressはユーザが多いので完成度も高いかと思ったら、細かい不具合は色々あるみたいですね。
オープンソースウェアの宿命なのかもです。
トラックバック (0)
この記事へのトラックバックはまだありません。
あー、やっかいですよね、コレ。
うちのfunction wpautopにはこんなのを付け加えてます。ブロック要素として振る舞う場合はコレでなんとかなりましたが、インライン要素のins, del要素はまだうまくいかないようなので試行錯誤中なんですが。
$pee = preg_replace(’!\s*(]*>)!’, “$1″, $pee);
$pee = preg_replace(’!(]*>)\s*!’, “$1″, $pee);
$pee = preg_replace(’!(\n|)(.*)\n(|)!’, ‘$2′, $pee);
$pee = preg_replace(’!(\n|)(.*)\n(|)!’, ‘$2′, $pee);
ちなみに、contact-form-7というWordPress用プラグインは、勝手にwpautopを書き換えて
有効化するする処理を入れているので、それを入れている場合はその処理の部分を
切って置いた方がいいです、一時期私もはまりました。