WordPressではscript要素や連続するハイフンも自動整形される

WordPressでins要素が不正な(X)HTMLに変換される」で、WordPressの自動整形機能が(X)HTMLを破壊することがあると書きましたが、script要素や連続するプレーンハイフンを使った場合にも同様の不具合があることに気づきました。

ブログの場合には、記事ごとにJavaScriptを組み込みたい場合も少なからずあると思うのですが、WordPressでは次のような内容の記事を投稿した場合に不具合が起きます。

<script type="text/javascript">
  //<![CDATA[
      alert('ぼく、わあどぷれす。');
  //]]>
</script>

これは、「ぼく、わあどぷれす。」というダイアログウィンドウが表示されることを期待したものですが、実際には次のように変換されてしまうためJavaScriptは機能しません

<p><script type="text/javascript">
  //<![CDATA[
      alert(¥'ぼく、わあどぷれす。¥');
  //]]&gt;
</script></p>

また、連続するプレーンハイフンは異なる文字に変換されます。例えば、次のような内容の記事を投稿してみます。

<p>XHTMLのコメント宣言は&lt;!--で始まり、--以外の文字が任意の数だけ繰り返され、--&gt;で終わります。</p>
<pre>&lt;!-- これは正しいコメントです。 --&gt;
<strong>&lt;!---- これは誤ったコメントです。 ----&gt;</strong></pre>

これは次のように変換されます。

<p>XHTMLのコメント宣言は&lt;!&#8211;で始まり、&#8211;以外の文字が任意の数だけ繰り返され、&#8211;&gt;で終わります。</p>
<pre>&lt;!-- これは正しいコメントです。 --&gt;
<strong>&lt;!&#8212;- これは誤ったコメントです。 &#8212;-&gt;</strong></pre>

そして、レンダリング結果は次のようになります。

XHTMLのコメント宣言は<!–で始まり、–以外の文字が任意の数だけ繰り返され、–>で終わります。

<!-- これは正しいコメントです。 -->
<!—- これは誤ったコメントです。 —->

原文の意図が全く伝わらない暗号と化しています。&#8211;(–)も&#8212;(—)もプレーンハイフンの&#45;(-)とは異なる文字です。

調べてみると、pre要素やcode要素の直下にあるハイフンに限っては正しく出力されるようですが、孫要素以下の連続するハイフンは異なる文字に変換されてしまいました。また、pre要素やcode要素と同様に原文との同一性に意味があるはずのsamp要素やq要素、blockquote要素でも、連続するハイフンが別の文字へ変換されてしまうという微妙な実装になっていました。

さらに困ったことに、IEの独自仕様である条件付きコメントでも不具合が起こります。独自仕様とは言っても、条件付きコメントはコメント宣言として正しい書式です。

<!--[if !IE]>--><p>私はIEではありません。</p><!--<![endif]-->

これはIEではコメントとして扱われ、IE以外では私はIEではありません。とレンダリングされるはずです。ところが、WordPressでは次のように変換されるため(X)HTMLを破壊します。

<!--[if !IE]>&#8211;><p>私はIEではありません。</p><!--<![endif]-->

解決策は、面倒ですが、JavaScriptは外部ファイルにすること、連続するプレーンハイフンは数値参照(&#45;や&#x2d)を使って記述することです。IEを排除する条件付きコメントについては次のようにするといいようです。

<!--[if !IE]> <--><p>刑事さん、私は本当にIEではないんですよ。</p><!--> <![endif]-->

今のWordPressは、XMLXHTMLを扱うには不向きなCMSかもしれません。ソースコードを見た感じでは、他にもWordPress検閲が行われるパターンがありそうな気がします。簡単に全て無効化できるといいのですが… :x

コメント (2)

  • leva
  • 2008-01-14 15:04

単純に無効にするならwp-includes/default-filters.phpの
add_filter($filter, ‘wpautop’);
という部分をコメントアウトすればよいですね。といっても、それは一般ユーザには難しいので、もう少し融通の利く設計になってくれればいいのですけどね。

ちなみに投稿設定の「不正にネスト化した XHTML を自動的に修正する」は無効にしてらっしゃいますか?

levaさん、「不正にネスト化した XHTML を自動的に修正する」は無効にしてます。

JavaScriptに関しては、Contact Form 7をアップデートした際にwpautopがまた有効になっていました orz
wpautopを無効にしたら使えるようになりました。ありがとうございます :D

ハイフンは、どうやら他のフィルタだかで処理されているみたいでダメでした。
他の部分に影響がでるとまずいので、調べてみないといじっていいものやらという感じです :x

コメントフォーム

トラックバック (1)

[…] バージョンアップしたからか、ニコ動のスクリプトが無効になった。 探してみると、こちらのコメントによれば、以下の様にすればいいらしい。 wp-includes/default-filters.phpの add_filter($filter […]

この記事のトラックバックURI
http://dxd8.com/archives/27/trackback/
この記事のURI
http://dxd8.com/archives/27/