สำหรับคนที่ทำเว็บไซต์ด้วย 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]);
}
}
});
การจัดการทั้งในระดับฐานข้อมูลและระดับแอปพลิเคชันด้วยวิธีนี้ จะช่วยคืนพื้นที่ให้ฐานข้อมูล ลดการทำงานของแบ็กเอนด์ที่ไม่จำเป็น และทำให้ส่วนแสดงความคิดเห็นในบทความสะอาดตา ปราศจากข้อความแจ้งเตือนที่สร้างขึ้นเองโดยไม่ตั้งใจ
อ่านเพิ่มเติม