เขียนเรื่อง spam comments มาหลายทีแล้ว แต่ยังจัดการแบบให้เรียบร้อยไม่ได้สักที bad behavior + akismet ดูเหมือนจะได้ผลดีที่สุด แต่มีปัญหาตรงที่ bad behavior มันกีดกันจนเกินควมพอดี เนื่องจากมันตรวจจาก ip ว่าตรงกับฐานข้อมูลของมันหรือเปล่า ถ้าอยู่ใน range มันก็ซวยไป ขนาดเจ้าของบล็อก วันดีคืนดีต่อเนตได้ ip ที่อยู่ในรายการของมัน ก็โดนมันบล็อคได้เหมือนกัน ส่วน akismet มันแค่ดูด spam comments เข้าไปซ่อนเท่านั้น ไม่ได้ป้้องกันไม่ให้พวกนี้เข้ามาตอบลง db ของเรา

เมื่อ plug-in สำเร็จรูปแบบง่ายๆ ใช้ไม่ได้ผล ผมก็ต้องใช้วิธีบ้านๆ แก้เอา

spam ตัวป่วนมันจะมาในสองรูปแบบ อันแรกมันเขียนโปรแกรมส่งค่าพารามิเตอร์ ยิงเข้าไปที่ส่วนรับข้อมูลคอมเมนต์ของ wordpress เลย ซึ่งก็คือ wp-comments-post.php วันนึงโดนยิงประมาณ 80 ครั้งได้ วิธีแก้คือ rename file ดังกล่าวไปเป็นชื่ออื่นซะ แล้วก็ไปแก้ comments.php ตรง <form action="<?php echo get_option('siteurl');?>/wp-comments-post.php>" method="post" id="commentform"> ให้ชื่อตรงกันกับ file ใหม่ด้วย

ด้วยวิธีนี้ สามารถลด spam comments ลงไปได้ประมาณ 70% แต่มันยังมีมาในรูปแบบที่สองคือ มันเข้ามาที่บล็อกของเรา แล้วใส่ข้อมูลลงไปใน comment box ตรงๆ วิธีแก้ก็คือ เพิ่ม text field อีกอันใน comments.php

<input type="text" name="word" id="word" value="<?php echo $comment_word; ?>" class="textfield" tabindex="4" />

แล้วก็ไปเพิ่มใน wp-comments-post.php แถวๆ line 45

$comment_word = trim($_POST['word']);
if ( 'คำที่ต้องการ' != $comment_word )
die( __('... incomplete.') );

ป.ล. มีวิธีง่ายๆอย่าง plug-in challenge, gatekeeper, และอื่นๆหาได้ที่ wordpress codex แต่ลองหลายอันแล้ว ไม่ถูกใจ

2007.01.11