WordpressはいつCDATAのインラインスクリプトをラップしますか?


11

ワードプレスのユーザーがスクリプトのスニペットとhtmlを自分の投稿の本文にコピー/ペーストすることで、もちろん私たちのサードパーティスクリプトの問題をデバッグしています(もちろん、非現実的な例):

<script>
window.foobar = window.foobar || { hello: function(){ console.log('Hello World'); } };
window.foobar.hello();
</script>

ワードプレスのインストールによってはこれをCDATAでラップするものもあれば、そうでないものもあることに気づきました(おそらく、何らかのDOCTYPEチェックを行ったためです-これでテストしたすべてのテーマはHTML5 doctypeを使用していました)。

ただし、CDATAでスクリプトをラップすると、ユーザーは次のバグに噛まれるでしょう:https : //core.trac.wordpress.org/ticket/3670(クロージング>が誤ってに置き換えられます&gt;)。これにより、ブラウザーはスクリプトの内容を無視します。 :

<script>// <![CDATA[  window.foobar = window.foobar || { hello: function(){ console.log('Hello World'); } }; window.foobar.hello();  // ]]&gt;</script>

私はWP-Fuをあまり所有していませんが、グーグルで問題を特定するだけでしたので、私の質問は、WordPressがインラインスクリプトをCDATAセクションにラップするのはいつですか?ユーザーはどういうわけかこの動作を防ぐことができますか?ユーザーは、WPコアを変更せずに、上記のバグをどうにかして回避できますか?


1
エディターでインラインJSを貼り付ける場合、WPはこの動作を実行する必要があります。私が使ってJSをエンキューすることをお勧めwp_headまたはwp_enqueue_scriptを...
サミュエル・ELH

WYSIWYGエディターのように「投稿の本文」を意味しますか?私が見ることができることから、JSはスクリプトが印刷されるときにCDATAタグにラップされます(これはさまざまな方法で呼び出される可能性があります)が、フィルター可能ではありません。私が想像するなら、もしあなた投稿のWYSIWYGを意味しているなら、それはテーマによって行われたコンテンツに対する何らかのフィルタリングかもしれない。
Doug Belchamber 2017年

1
WYSIWYGエディターでJavaScriptを投稿することはお勧めしません。エディターには、インラインjsとの相互作用が不十分なコンテンツをクリーンアップするためのいくつかのフィルターがあります。このタイプのシナリオに役立つプラグインがあります。
MikeNGarrett

回答:


1

実際、CDATAタグを挿入しているのはWordPress ではなく、ビジュアルエディターのTinyMCEです。TinyMCEの詳細はここではトピック外ですが、Stackoverflowでこれの解決策を読むことができます

そうは言っても、TinyMCEを停止するだけでは完全なソリューションとはならない場合があります。WordPress自体にもCDATAタグを追加する機能がありますwxr_cdata。これは、有効なxml-fileを出力するときに使用されます。たとえば、使用するファイルをrss-feedにエクスポートする場合などです。テーマやプラグインは、ドキュメントを有効なxhtmlにしたい場合、このフィルターをコンテンツに添付することを決定できます。

ここでバグが発生します。バグは12年前に最初に文書化され、未解決のままです。それはこれらの3行についてですthe_content

$content = apply_filters( 'the_content', $content );
$content = str_replace( ']]>', ']]&gt;', $content );
echo $content;

ご覧のとおり、str_replaceはハードコードされており、直後にエコーが続きます。この置換を傍受する方法はありません。

ただし、テーマを制御する場合にできることは、バッファリング the_contentと置換の反転です。このような:

ob_start();
the_content();
$content = ob_get_clean();
$content = str_replace( ']]&gt', ']]>', $content ); 
echo $content;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.