ในการดูแลเว็บไซต์ WordPress ที่ผ่านการอัปเกรดมายาวนาน ปัญหาคลาสสิกที่นักพัฒนามักพบคือ ความไม่เข้ากันของโครงสร้างเนื้อหา ระหว่างระบบเก่า (Classic Editor / TinyMCE) กับระบบใหม่ (Gutenberg Block Editor) การค้นหาว่าบทความใดในฐานข้อมูลยังคงเป็นรูปแบบเดิม หรือมี Classic Block ฝังอยู่ จึงเป็นขั้นตอนแรกที่จำเป็นก่อนเริ่มทำ Content Migration หรือปรับปรุงธีม
กลไกการจัดเก็บข้อมูล: Block vs Classic ในระดับ Database
ในตาราง wp_posts ฟิลด์ post_content จะเก็บสตริงข้อความดิบไว้โดยตรง ความแตกต่างระหว่างทั้งสองยุคขึ้นอยู่กับ Block Grammar
- Gutenberg Block
อาศัย HTML Comments Delimiters กำกับบล็อก เช่น<!-- wp:paragraph -->...<!-- /wp:paragraph --> - Classic Editor ดั้งเดิม
เก็บแท็ก HTML ธรรมดา เช่น<p>ข้อความ</p>โดยไม่มีคอมเมนต์<!-- wp:อยู่เลย - Classic Block ภายใน Gutenberg
หากแปลงหรือเปิดบทความเดิมด้วย Block Editor ตัวระบบจะนำเนื้อหา Classic นั้นไปหุ้มด้วยบล็อกชื่อcore/freeformโดยมีคอมเมนต์กำกับคือ<!-- wp:freeform -->
รวมคำสั่ง SQL ค้นหา Classic Content ใน WordPress
(หมายเหตุ: สามารถแทนที่ wp_ ด้วย Database Prefix จริงที่ใช้งาน เช่น wp700_)
1. ค้นหาบทความ Classic ทั้งหมด (ไม่มี Gutenberg Block ผสมอยู่เลย)
คำสั่งนี้จะกรองเฉพาะบทความสถานะ publish ที่เนื้อหาไม่มีไวยากรณ์ <!-- wp: ปรากฏอยู่เลย
SELECT
ID,
post_title,
post_date,
CHAR_LENGTH(post_content) AS content_length
FROM wp_posts
WHERE post_type = 'post'
AND post_status = 'publish'
AND post_content NOT LIKE '%<!-- wp:%'
AND TRIM(post_content) != ''
ORDER BY ID DESC;
2. ค้นหาบทความที่มี Classic Block ซ่อนอยู่ (wp:freeform)
กรณีนี้คือบทความที่เริ่มใช้ Gutenberg แล้ว แต่มีบางส่วนถูกแปลงเป็น Classic Block ตกค้างไว้
SELECT
ID,
post_title,
post_date
FROM wp_posts
WHERE post_type = 'post'
AND post_status = 'publish'
AND post_content LIKE '%<!-- wp:freeform%'
ORDER BY ID DESC;
3. สรุปภาพรวมสัดส่วนเนื้อหาทั้งระบบ (Audit Dashboard Query)
รันคำสั่งจัดกลุ่มนี้เพื่อประเมินปริมาณงานว่ามีบทความประเภทใดอยู่เท่าไรในระบบ
SELECT
CASE
WHEN post_content LIKE '%<!-- wp:freeform%' THEN 'Contains Classic Block (wp:freeform)'
WHEN post_content LIKE '%<!-- wp:%' THEN 'Pure Gutenberg Block'
WHEN TRIM(post_content) = '' THEN 'Empty Content'
ELSE 'Pure Classic (No Block)'
END AS content_type,
COUNT(*) AS total_count
FROM wp_posts
WHERE post_type = 'post'
AND post_status = 'publish'
GROUP BY content_type;
ข้อควรระวังในการนำไปใช้งาน
- อย่าดูเพียง Class หน้าเว็บ
แท็กเช่น<p class="wp-block-paragraph">ที่เห็นทางหน้าบ้าน เป็นเพียงผลลัพธ์การเรนเดอร์ HTML ไม่ใช่ข้อพิสูจน์ว่าในpost_contentเป็น Gutenberg เสมอไป - การทำ Index
การใช้LIKE '%...%'จะเป็นการทำ Full Table Scan หากฐานข้อมูลมีหลักหมื่นหรือหลักแสนโพสต์ ควรรันบนระบบทดสอบ (Staging) หรือกำหนดช่วงpost_dateและIDเพื่อลดโหลดของ Database Server