Saya sedang men-debug masalah dengan skrip pihak ketiga milik kami yang digunakan pengguna wordpress dengan menyalin / menempelkan cuplikan skrip dan html ke tubuh postingan mereka seperti (contoh dunia non-nyata tentu saja):
<script>
window.foobar = window.foobar || { hello: function(){ console.log('Hello World'); } };
window.foobar.hello();
</script>
Saya perhatikan bahwa beberapa instalasi wordpress akan membungkus ini dalam CDATA, beberapa tidak akan (mungkin dengan melakukan semacam pemeriksaan DOCTYPE - meskipun semua tema yang saya uji ini menggunakan doctype HTML5).
Namun, ketika membungkus skrip dalam CDATA, pengguna akan digigit oleh bug berikut: https://core.trac.wordpress.org/ticket/3670 (penutupan >
tidak diganti dengan benar >
) yang menyebabkan browser mengabaikan konten skrip :
<script>// <![CDATA[ window.foobar = window.foobar || { hello: function(){ console.log('Hello World'); } }; window.foobar.hello(); // ]]></script>
Saya tidak memiliki terlalu banyak WP-Fu dan googling hanya membuat saya mengidentifikasi masalah apa adanya, jadi pertanyaan saya adalah: kapan tepatnya WordPress membungkus skrip inline ke dalam bagian CDATA? Dapatkah pengguna entah bagaimana mencegah perilaku ini? Dapatkah pengguna entah bagaimana mengatasi bug di atas tanpa mengubah WP core?
sumber
Jawaban:
Sebenarnya, bukan WordPress yang menyisipkan
CDATA
tag, tetapi editor visual, TinyMCE. Detail TinyMCE tidak tersedia di sini, tetapi Anda dapat membaca solusi untuk ini di Stackoverflow .Yang mengatakan, menghentikan TinyMCE mungkin bukan solusi lengkap yang Anda inginkan. WordPress sendiri juga memiliki fungsi untuk menambahkan
CDATA
tag,,wxr_cdata
yang digunakan saat mengeluarkan file xml yang valid, misalnya jika Anda ingin mengekspor file penggunaan konten dalam rss-feed. Tema dan / atau plugin dapat memutuskan untuk melampirkan filter ini ke konten jika mereka menginginkan dokumen tersebut valid xhtml.Di sinilah Anda kemudian mengalami bug , yang pertama kali didokumentasikan dua belas tahun yang lalu dan tetap belum terpecahkan. Ini tentang tiga baris ini di
the_content
:Seperti yang Anda lihat,
str_replace
hardcoded, segera diikuti oleh gema. Tidak ada cara untuk mencegat penggantian ini.Apa yang dapat Anda lakukan, jika Anda mengontrol tema Anda, adalah buffer
the_content
dan membalikkan penggantinya. Seperti ini:sumber