Wordpress จะห่อสคริปต์แบบอินไลน์ใน CDATA เมื่อใด


11

ฉันกำลังดีบักปัญหากับสคริปต์บุคคลที่สามของเราที่ผู้ใช้ wordpress ใช้โดยการคัดลอก / วางส่วนของสคริปต์และ html ลงในเนื้อหาของโพสต์เช่น (ไม่ใช่ตัวอย่างของโลกที่แท้จริง):

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

ฉันสังเกตเห็นว่าการติดตั้ง wordpress บางส่วนจะห่อสิ่งนี้ใน 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 มากเกินไปและ googling ทำให้ฉันระบุปัญหาได้เท่านั้นดังนั้นคำถามของฉันคือเมื่อใดที่ WordPress รวมสคริปต์อินไลน์ลงในส่วนของ CDATA ผู้ใช้สามารถป้องกันพฤติกรรมนี้ได้หรือไม่? ผู้ใช้สามารถแก้ไขข้อผิดพลาดข้างต้นได้โดยไม่ต้องแก้ไข WP core หรือไม่?


1
เมื่อวาง inline JS ในเอดิเตอร์ WP ควรทำสิ่งนี้ ฉันขอแนะนำให้จัดทำ JS โดยใช้wp_headหรือ wp_enqueue_script ..
Samuel Elh

คุณหมายถึง "ร่างกายโพสต์" เช่นเดียวกับในโปรแกรมแก้ไขแบบ WYSIWYG? จากสิ่งที่ฉันเห็น JS ถูกห่อในแท็ก CDATA เมื่อสคริปต์ถูกพิมพ์ (ซึ่งสามารถเรียกใช้ในหลายวิธี) แต่ไม่สามารถกรองได้ ฉันคิดว่าถ้าคุณทำหมายถึง WYSIWYG โพสต์ก็อาจจะมีบางอย่างเกี่ยวกับการกรองเนื้อหาที่ทำโดยรูปแบบ
Doug Belchamber

1
ไม่แนะนำให้คุณโพสต์จาวาสคริปต์ในโปรแกรมแก้ไขแบบ WYSIWYG เครื่องมือแก้ไขมีตัวกรองจำนวนหนึ่งเพื่อล้างเนื้อหาของคุณที่มีปฏิสัมพันธ์ไม่ดีกับ inline js มีปลั๊กอินที่ช่วยในสถานการณ์ประเภทนี้
MikeNGarrett

คำตอบ:


1

จริงๆแล้วมันไม่ใช่ WordPress ที่แทรกCDATAแท็ก แต่เป็น TinyMCE editor ที่มองเห็น รายละเอียดของ TinyMCE เป็น offtopic นี่ แต่คุณสามารถอ่านวิธีแก้ปัญหานี้ใน Stackoverflow

ที่กล่าวว่าการหยุด TinyMCE อาจไม่ใช่วิธีการแก้ปัญหาแบบเต็มรูปแบบที่คุณต้องการ WordPress เองยังมีฟังก์ชั่นสำหรับเพิ่มCDATAแท็กwxr_cdataซึ่งใช้เมื่อแสดงผลไฟล์ xml ที่ถูกต้องตัวอย่างเช่นหากคุณต้องการส่งออกไฟล์ที่ใช้เนื้อหาใน rss-feed ธีมและ / หรือปลั๊กอินสามารถตัดสินใจที่จะแนบตัวกรองนี้กับเนื้อหาหากพวกเขาต้องการให้เอกสารเป็น xhtml ที่ถูกต้อง

นี่คือที่ที่คุณพบข้อผิดพลาดซึ่งได้รับการบันทึกเป็นครั้งแรกเมื่อสิบสองปีก่อนและยังไม่ได้รับการแก้ไข มันเกี่ยวกับสามบรรทัดใน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.