WordPress: แก้ Double / Triple Escaping
เพราะว่า blog เขียนมานานจากที่เป็นระบบเก่าจนเปลี่ยนมาใช้ Gutenberg ทำให้บางครั้งการ import / export / convert block มันทำให้มีความผิดพลาด ในการ Double / Triple Escaping เช่น ปัญหาเกิดจากการที่ WordPress ( หรือตัว Plugin Syntax Highlighter ) พยายามจะ “ช่วย” Escape ตัวอักษรพิเศษซ้ำซ้อน จนทำให้ & กลายเป็น & และส่งผลให้ < กลายเป็น &amp;lt; ( Double / Triple Escaped ) อย่างที่เห็นในเนื้อหา จนไม่สามารถ copy code เอาไปใช้ได้ทันที บางครั้งขนาดที่ว่า ถ้าไม่เคยเขียนภาษานั้น ๆ จนชิน จะดูไม่ออกเลยว่าโค้ทตัวอย่างมันเขียนอะไรไว้เลย
Query Double / Triple Escaping
SELECT
ID,
post_title,
post_status,
-- ระบุตำแหน่งที่พบเป็นตัวเลข (Index)
LOCATE('&', post_content) AS found_at_position,
-- ดึงข้อความรอบๆ จุดที่พบ (หน้า 20 หลัง 50 ตัวอักษร) เพื่อดูบริบท
SUBSTRING(post_content, GREATEST(1, LOCATE('&', post_content) - 20), 70) AS error_context,
post_content
FROM wp_posts
WHERE (
post_content LIKE '%&lt;%'
OR post_content LIKE '%&gt;%'
OR post_content LIKE '%&quot;%'
OR post_content LIKE '%&amp;%'
)
AND post_status IN ('publish', 'schedule')
ORDER BY ID ASC;
การทำงานจะเป็นการค้นหา HTML Escaping ที่ผิดจากตัวอย่างที่เจอในบทความที่ publish หรือ schedule ไว้ จากนั้นจะแสดงออกมาเป็น
| ID | post_title | post_status | found_at_position | error_context | post_content |
|---|---|---|---|---|---|
| 1784 | สร้าง Data Dictionary แบบด่วน ๆ | publish | 2868 | — 1. Table Header & Caption (คง REPLACE ไว้เ… | <!– wp:html –> <div class=”alert alert-info” rol… |
| 2486 | joget: BeanShell Form Binder | publish | 2429 | imaryKey (Unescaped && เรียบร้อยแล้ว) … | <!– wp:paragraph –> <p>ตัวอย่างการใช้ BeanShell … |
| 6974 | Tabulator: data.filters | publish | 2257 | option value=”<”>&lt;</option> <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 (<) ให้เองอย่างถูกต้อง - SQL ที่รันไป: หากคุณรัน SQL Replace ไปแล้ว อย่าลืมตรวจสอบหน้าเพจสำคัญ ๆ อีกสักรอบ โดยเฉพาะพวกที่มี
JSONหรือT-SQLเพราะบางครั้งการเบิ้ล Escape อาจจะเกิดจาก Plugin บางตัวที่เรายังใช้งานอยู่ครับ
อ่านเพิ่มเติม