PlusMagi's Blog By Pitt Phunsanit Uncategorized WordPress: วิธีเขียน SQL Query ค้นหา Classic Block และเนื้อหายุคเก่า

WordPress: วิธีเขียน SQL Query ค้นหา Classic Block และเนื้อหายุคเก่า

ในการดูแลเว็บไซต์ 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 '%&lt;!-- wp:freeform%' THEN 'Contains Classic Block (wp:freeform)'
        WHEN post_content LIKE '%&lt;!-- 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;


ข้อควรระวังในการนำไปใช้งาน

  1. อย่าดูเพียง Class หน้าเว็บ
    แท็กเช่น <p class="wp-block-paragraph"> ที่เห็นทางหน้าบ้าน เป็นเพียงผลลัพธ์การเรนเดอร์ HTML ไม่ใช่ข้อพิสูจน์ว่าใน post_content เป็น Gutenberg เสมอไป
  2. การทำ Index
    การใช้ LIKE '%...%' จะเป็นการทำ Full Table Scan หากฐานข้อมูลมีหลักหมื่นหรือหลักแสนโพสต์ ควรรันบนระบบทดสอบ (Staging) หรือกำหนดช่วง post_date และ ID เพื่อลดโหลดของ Database Server