PlusMagi's Blog By Pitt Phunsanit เทคโนโลยี WordPress: วิธีล้างขยะ Self-Pingbacks และ Trackbacks ของตัวเองออกจากฐานข้อมูล

WordPress: วิธีล้างขยะ Self-Pingbacks และ Trackbacks ของตัวเองออกจากฐานข้อมูล

สำหรับคนที่ทำเว็บไซต์ด้วย WordPress มาเป็นเวลานาน หนึ่งในปัญหาชวนน่ารำคาญใจที่มักเจอในช่องคอมเมนต์คือการแจ้งเตือนประเภท Pingback หรือ Trackback ที่ไม่ได้มาจากเว็บอื่น แต่มาจากเว็บไซต์ของเราเอง (Self-Pings)

ปัญหานี้เกิดขึ้นเมื่อเราเขียนบทความใหม่แล้วทำ Internal Link อ้างอิงไปยังบทความเก่าในโดเมนเดียวกัน ไม่ว่าจะเป็นโดเมนหลักอย่าง plusmagi.com, โดเมนย่อย pitt.plusmagi.com หรือ [www.plusmagi.com](https://www.plusmagi.com) ระบบของ WordPress จะส่ง Pingback ไปยัง URL ปลายทางโดยอัตโนมัติ ทำให้เกิดคอมเมนต์ขยะรกฐานข้อมูลและทำให้ตัวเลขแสดงจำนวนคอมเมนต์หน้าเว็บบิดเบือนไปจากความเป็นจริง

บทความนี้จะพาไปดูวิธีค้นหาและล้างข้อมูล Pingbacks ของตัวเองออกจากฐานข้อมูล MySQL/MariaDB พร้อมวิธีป้องกันไม่ให้เกิดขึ้นอีกในอนาคต


ข้อควรระวังก่อนเริ่มปฏิบัติการ

เนื่องจากการจัดการโดยตรงบนฐานข้อมูลมีความเสี่ยง หากใส่เงื่อนไขผิดอาจทำให้ข้อมูลคอมเมนต์จริงหายได้ ก่อนทำทุกครั้งให้สำรองข้อมูล (Backup) ฐานข้อมูลไว้ก่อนเสมอ

mysqldump -u [username] -p [database_name] > backup_before_cleanup.sql

ขั้นตอนที่ 1: ตรวจสอบจำนวนข้อมูลก่อนลบ (Dry Run)

เข้าสู่ระบบจัดการฐานข้อมูล (ผ่าน Terminal, phpMyAdmin หรือโปรแกรมจัดการ DB อย่าง DBeaver/HeidiSQL) แล้วรันคำสั่ง Query เพื่อดูว่ามี Pingbacks/Trackbacks ที่เชื่อมโยงกับชื่อโดเมนของเรามากน้อยเพียงใด

SELECT comment_ID, comment_post_ID, comment_author_url, comment_type 
FROM wp_comments 
WHERE comment_type IN ('pingback', 'trackback')
  AND (
    comment_author_url LIKE '%plusmagi.com%'
    OR comment_author_url LIKE '%.plusmagi%'
  );

(หากตารางฐานข้อมูลใช้ Prefix อื่นที่ไม่ใช่ wp_ เช่น wp_site_ ให้เปลี่ยนชื่อตารางให้ตรงกับระบบ)


ขั้นตอนที่ 2: ลบข้อมูลที่ผูกอยู่และรายการคอมเมนต์จริง

ข้อมูลของคอมเมนต์ใน WordPress จะถูกเก็บไว้สองตารางหลัก คือ wp_comments (ข้อมูลหลัก) และ wp_commentmeta (ข้อมูลเสริม) การลบให้สะอาดหมดจดต้องลบทั้งสองส่วน

-- 1. ล้างข้อมูล meta ของ Pingbacks ที่ตรงเงื่อนไข
DELETE FROM wp_commentmeta 
WHERE comment_id IN (
    SELECT comment_ID 
    FROM wp_comments 
    WHERE comment_type IN ('pingback', 'trackback')
      AND (
        comment_author_url LIKE '%plusmagi.com%'
        OR comment_author_url LIKE '%.plusmagi%'
      )
);

-- 2. ลบแถวข้อมูล Pingbacks ออกจากตารางหลัก
DELETE FROM wp_comments 
WHERE comment_type IN ('pingback', 'trackback')
  AND (
    comment_author_url LIKE '%plusmagi.com%'
    OR comment_author_url LIKE '%.plusmagi%'
  );

ขั้นตอนที่ 3: คำนวณและปรับยอดตัวนับคอมเมนต์ใหม่ (Recount)

WordPress จะมีการแคชจำนวนคอมเมนต์ที่อนุมัติแล้วไว้ในคอลัมน์ comment_count ของตาราง wp_posts เมื่อเราสั่งลบแถวออกจาก wp_comments โดยตรง ตัวเลขนับนี้จะไม่ลดลงตามอัตโนมัติ ให้รันคำสั่งนี้เพื่ออัปเดตยอดตัวเลขให้ตรงกับความจริง

UPDATE wp_posts p 
SET comment_count = (
    SELECT COUNT(*) 
    FROM wp_comments c 
    WHERE c.comment_post_ID = p.ID 
      AND c.comment_approved = '1'
);

ขั้นตอนที่ 4: ป้องกันไม่ให้ WordPress ส่ง Ping หาตัวเองอีกในอนาคต

หลังจากล้างฐานข้อมูลเสร็จเรียบร้อยแล้ว หากเรายังคงใส่ Internal Link ข้ามบทความ ระบบก็จะยังคงวนกลับมาส่ง Pingback อีก วิธีแก้ไขแบบถาวรคือการใช้ฟังก์ชัน Hook เพื่อสั่งให้ WordPress ตัด URL โดเมนตัวเองออกจากคิวการส่ง Ping

สร้างไฟล์เป็น Must-Use Plugin ไว้ที่โฟลเดอร์ wp-content/mu-plugins/no-self-ping.php (หรือวางไว้ใน functions.php ของธีมที่ใช้งานอยู่)

<?php
/**
 * Plugin Name: Disable Self-Pingbacks
 * Description: ป้องกันไม่ให้ WordPress ส่ง Pingback หาโดเมนตัวเอง
 */

add_action('pre_ping', function(&$links) {
    $home_url = get_option('home');
    foreach ($links as $index => $link) {
        // หากลิงก์ขึ้นต้นด้วย URL ของเว็บไซต์ตัวเอง ให้ตัดออกจากรายการ Ping ทันที
        if (strpos($link, $home_url) === 0) {
            unset($links[$index]);
        }
    }
});

การจัดการทั้งในระดับฐานข้อมูลและระดับแอปพลิเคชันด้วยวิธีนี้ จะช่วยคืนพื้นที่ให้ฐานข้อมูล ลดการทำงานของแบ็กเอนด์ที่ไม่จำเป็น และทำให้ส่วนแสดงความคิดเห็นในบทความสะอาดตา ปราศจากข้อความแจ้งเตือนที่สร้างขึ้นเองโดยไม่ตั้งใจ


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