制作ブログ Web制作アプリケーションWordPressスパムコメントをプラグインなしで除去したい → comment_post

スパムコメントをプラグインなしで除去したい → comment_post

ある朝、メールが何十件も届いていて何かと思ったら、このブログへのスパムコメントだった。
管理画面からコメントをスパム判定していく。同日の昼。メール確認したら、今朝の倍の量でスパムのコメント通知。さすがに対応することにした。
WordPressでデフォルトで入っているプラグイン「Akismet」があるが、ぼくの場合、ブログにGoogle AdSenceの広告を入れているため「Akismet」の無料版が使えない。
そこでコメントしたタイミングをトリガーとして自作することにした。

前提 本文とニックネームだけでコメントできること

スパムコメントを除外する方法としては、コメント入力の負荷を上げる、たとえばログイン必須にするとか、自動投稿できないように、ログイン必須にしたり入力必須項目を増やして対応することも可能だが、あくまでそれらは最終手段。UXは変えずに、裏側の処理だけで解決したい。

comment_post

修正するファイルは、functions.php 。
この記事を参考にされる場合は、修正前には必ずバックアップを取り、自己責任でお願いします。

functions.php

function mp_comment_before($comment_ID) {
  $comment_data = get_comment($comment_ID);
  $comment_content = $comment_data -> comment_content;
  
  $post_id = $comment_data -> comment_post_ID;
  $link = get_permalink($post_id);

  // 日本語が含まれているか判別する
  if (strlen($comment_content) != mb_strlen($comment_content, 'utf8')) {
    wp_mail('メールアドレス', 'メールタイトル', $link."\n\n".$comment_content);
  } else {
    wp_delete_comment($comment_ID, true);
  }
}
add_action('comment_post', 'mp_comment_before', 10, 2);

comment_post は日本語の解説では、コメント送信後、データベースに保存される直前に実行されるとのことだったが、実際には、コメントがデータベースに保存された直後に実行されるメソッドだった。そこで、コメントが投稿されたとき、下記の流れで処理するようにした。

  1. そのコメントがスパムではないか判別する
  2. スパムの場合はそのコメントを永久削除する
  3. それ以外(正常なコメント)は自分宛にメール通知する

補足1) mp_comment_before という関数名は任意。ぼくの場合はワードプレス用の関数として、mp_ を接頭辞として付けるようにしている。wp_ は本家が利用しているので、万が一関数名が被ってしまうことへの配慮だ。

補足2) スパム判定とする条件式は、ここではコメント本文がすべて英語の場合としているが、もちろん自分のスタイルに合わせて条件式は変更可。

補足3) メール通知だが、comment_post を利用すると、WordPressの設定 > ディスカッション で自分宛のメールを「コメントが投稿されたとき」にチェックを入れていても無効となった。とはいえ、スパムのときは通知はいらないので結果問題ない。正常なコメントがあった場合のみメール通知を受け取るように、wp_mail でセットする。