WordPressでWebサイトを公開すると、記事へのスパムコメントが結構来るようになります。
承認前のコメントなら表に表示されないとしても、管理画面でいちいちスパムコメントをゴミ箱へ移動で削除するのも面倒です。
最初からスパムコメントを拒否するにはどうすればよいか?
ひらがな・カタカナを含まない時に拒否
通常の日本語の文章であれば、少なくとも1文字はひらがな・カタカナを含むはず。であればこれを条件に拒否してみます。
この条件だと、漢字だけのコメント(例:祝優勝)や、顔文字(例:(^-^ )やアスキーアートも拒否してしまうのが難点ですが、あまり問題にならなさそうであればよいでしょう。
以下のようなコードを functions.php か自作のプラグインに追記すると、ひらがな、カタカナを含まないコメント、英数字のみのコメントが送信できないようになります。
add_action('pre_comment_on_post', 'my_custome_spam_filter');
function my_custome_spam_filter($comment_post_ID)
{
	$comment = (isset($_POST['comment']) ? trim($_POST['comment']) : null);
	// ひらがな・カタカナが見当たらなければ拒否
	if (!preg_match('/[ぁ-んァ-ヶー]+/u', $comment)) {
		wp_die('日本語の文章ではないと判定されました。');
	}
}
コメント登録時のフックは pre_comment_on_post 。
preg_match で判定。UTF-8のマルチバイト文字を扱うのでuオプション。


URLを多数含む場合を拒否する
スパムコメントによくある特徴に、URLが多数含まれるということがあります。
「URL多すぎ」を条件にすると以下のようにできます。
add_action('pre_comment_on_post', 'my_custome_spam_filter');
function my_custome_spam_filter($comment_post_ID)
{
	$comment = (isset($_POST['comment']) ? trim($_POST['comment']) : null);
	// URLが5つ以上含まれたら却下
	if (substr_count($comment, 'http://') + substr_count($comment, 'https://') >= 5) {
		wp_die('URLが多すぎます');
	}
}
substr_count関数で http:// と https:// の数を数えています。5個を超えたら拒否していますが、個数は自由に調整できます。


さらに凝ったことをすると
NGワードなどあれば、「コメントに○○を含む場合は拒否」といったことも可能です。
