SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【WordPress】コメントが登録される前に処理を入れたい(スパムコメント対策など)

問題

WordPressにスパムコメントが結構やってきます。それらは「スパム」「承認待ち」などに溜まっていきます。

スパム対策のプラグインは試したことがないのですが、自分で数行書くだけで、自分なりの対策ができれば面白いと思って調べてみました。

目標

「コメントの内容次第ではデータベースに入る前に消し去りたい」

例えば、

wordpress

解決方法

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');

関連するメモ

コメント