自作スパムコメントフィルター

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個を超えたら拒否していますが、個数は自由に調整できます。

URLを大量に含むコメントを書いてみると

URLを大量に含むコメントの拒否に成功しました

さらに凝ったことをすると

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です