【WordPress】コメントが登録される前に処理を入れたい(スパムコメント対策など)
問題
WordPressにスパムコメントが結構やってきます。それらは「スパム」「承認待ち」などに溜まっていきます。
スパム対策のプラグインは試したことがないのですが、自分で数行書くだけで、自分なりの対策ができれば面白いと思って調べてみました。
目標
「コメントの内容次第ではデータベースに入る前に消し去りたい」
例えば、
- http://~が5個以上あったら、問答無用で処理を中止する。
- 特定のNGワードを含むときはとにかく無視したい。スパムにも承認待ちにもしたくない。データベースにも残って欲しくない。設定→ディスカッションにあるコメントブラックリストより厳しい対応をしたい。

解決方法
WordPressのフックに、こんなアクションがありました。
pre_comment_on_post
ドキュメントに載ってないみたいなんだけど?
そうですね。なぜでしょうね。将来的に変更の可能性があるアクションでしょうか。
なぜcomment_postアクションではだめなの?
comment_postアクションは、wp_new_comment()というコメント登録の処理の中で呼ばれますが、タイミングがデータベースにコメントが登録された後になります。
comment_postアクションを使って目標を達成しようとすると、いったんデータベースに入ったものをデータベースから削除するような処理になり、無駄が多いです。
使用例
頻繁にテーマを変えないならテーマの中のfunctions.phpに書くとすぐ使えます。プラグインとして作っても良いです。
pre_comment_on_postアクションにフックした関数には、対象となる投稿のIDだけしか渡してもらえないようなので、コメントの内容については$_POSTなどを見て判断することにします。
/**
* Simple Custome SPAM Filter
*
* コメントの内容($_POST['comment'])などを見て相手にしたくないコメントに対しては即刻停止する
*/
function simple_custome_spam_filter($comment_post_ID)
{
$comment = (isset($_POST['comment']) ? trim($_POST['comment']) : null);
$author = (isset($_POST['author']) ? trim(strip_tags($_POST['author'])) : null);
$email = (isset($_POST['email']) ? trim($_POST['email']) : null);
$url = (isset($_POST['url']) ? trim($_POST['url']) : null);
// 以下はお好みのルールを構築
if (substr_count($comment, 'http://') >= 5) {
// URLが5つ以上含まれたら即刻退出をお願いする
wp_die('そのコメントは却下します');
}
if (strpos($comment, 'どらえもん') !== false) {
// どらえもんじゃない!ドラえもんだ!と思ったら
wp_die('ドラえもんに言い直してください');
}
if ($_SERVER['REMOTE_ADDR'] == '123.456.789.0') {
// 特定のIPの方はコメントお断り とか
wp_die('いやです');
}
if ($author == 'softel') {
// そのニックネームは使ってはいけない とか
wp_die('ニックネーム変えて欲しいです');
}
}
add_action('pre_comment_on_post', 'simple_custome_spam_filter');