ป้ายกำกับ: <

WordPress: แก้ Double / Triple EscapingWordPress: แก้ Double / Triple Escaping

เพราะว่า blog เขียนมานานจากที่เป็นระบบเก่าจนเปลี่ยนมาใช้ Gutenberg ทำให้บางครั้งการ import / export / convert block มันทำให้มีความผิดพลาด ในการ Double / Triple Escaping เช่น ปัญหาเกิดจากการที่ WordPress ( หรือตัว Plugin Syntax Highlighter ) พยายามจะ “ช่วย” Escape ตัวอักษรพิเศษซ้ำซ้อน จนทำให้ & กลายเป็น &amp; และส่งผลให้ &lt; กลายเป็น &amp;amp;lt; ( Double / Triple Escaped ) อย่างที่เห็นในเนื้อหา จนไม่สามารถ copy code เอาไปใช้ได้ทันที บางครั้งขนาดที่ว่า ถ้าไม่เคยเขียนภาษานั้น ๆ จนชิน จะดูไม่ออกเลยว่าโค้ทตัวอย่างมันเขียนอะไรไว้เลย


Query Double / Triple Escaping

SELECT
	ID,
	post_title,
	post_status,
	-- ระบุตำแหน่งที่พบเป็นตัวเลข (Index)
	LOCATE('&amp;', post_content) AS found_at_position,
	-- ดึงข้อความรอบๆ จุดที่พบ (หน้า 20 หลัง 50 ตัวอักษร) เพื่อดูบริบท
	SUBSTRING(post_content, GREATEST(1, LOCATE('&amp;', post_content) - 20), 70) AS error_context,
	post_content
FROM wp_posts
WHERE (
	post_content LIKE '%&amp;lt;%'
	OR post_content LIKE '%&amp;gt;%'
	OR post_content LIKE '%&amp;quot;%'
	OR post_content LIKE '%&amp;amp;%'
)
AND post_status IN ('publish', 'schedule')
ORDER BY ID ASC;

การทำงานจะเป็นการค้นหา HTML Escaping ที่ผิดจากตัวอย่างที่เจอในบทความที่ publish หรือ schedule ไว้ จากนั้นจะแสดงออกมาเป็น

IDpost_titlepost_statusfound_at_positionerror_contextpost_content
1784สร้าง Data Dictionary แบบด่วน ๆpublish2868— 1. Table Header &amp; Caption (คง REPLACE ไว้เ…<!– wp:html –> <div class=”alert alert-info” rol…
2486joget: BeanShell Form Binderpublish2429imaryKey (Unescaped &amp;&amp; เรียบร้อยแล้ว)    …<!– wp:paragraph –> <p>ตัวอย่างการใช้ BeanShell …
6974Tabulator: data.filterspublish2257option value=”&lt;”>&amp;lt;&lt;/option>   &lt;op…<!– wp:paragraph –> <p>ตัวอย่างการทำ search / fi…

คำเตือน

ก่อนที่จะเปลี่ยนข้อความใน post_content โดยคำสั่ง replace ควรเอา ID ไปค้นหาบทความใน
/wp-admin/post.php?post={ ID}&action=edit

มากกว่าเพราะ

  • Backup: “จะลงใหม่หรือจะแก้เยอะ ให้ Backup/Snapshot ก่อน” กฎนี้ยังใช้ได้ดีกับทุกส่วนของระบบครับ ยิ่งเป็นการแก้ demo code ที่เขียนไว้นานแล้วแบบนี้ บางครั้งการที่มี Escaping ถูกแล้ว อยู่ด้วย
  • การวาง Code ใหม่: ต่อจากนี้ถ้าจะวาง Code แนะนำให้ใช้ Custom HTML Block หรือ Code Block ของ WordPress ( Gutenberg ) แล้ววางโค้ดที่เป็น “Raw Text” ( ที่มี < > จริง ๆ ) ลงไปครับ WordPress จะจัดการจัดเก็บแบบ Single Escape ( &lt; ) ให้เองอย่างถูกต้อง
  • SQL ที่รันไป: หากคุณรัน SQL Replace ไปแล้ว อย่าลืมตรวจสอบหน้าเพจสำคัญ ๆ อีกสักรอบ โดยเฉพาะพวกที่มี JSON หรือ T-SQL เพราะบางครั้งการเบิ้ล Escape อาจจะเกิดจาก Plugin บางตัวที่เรายังใช้งานอยู่ครับ

อ่านเพิ่มเติม