【WordPress】プラグインなしで、スパムコメント対策を実装する方法

2019-04-11WordPressWordPressカスタマイズ

WordPress使いだしてから、もしか僕レベルの技術力でも頑張ればfunctions.phpにちょっと書くくらいで、スパムコメント弾けないものかと思ってたのを本日チャレンジ

そのリアルタイム忘備録です

コメント認証フィルターフックでスパムコメント対策

コメント承認ステータスを変更するフィルターフック

pre_comment_approvedというものがありますね

日本語版codex.wordpress.orgは情報空っぽだったけど

https://codex.wordpress.org/Plugin_API/Filter_Reference/pre_comment_approved

なるほど、投稿されたコメント情報もこれで受け取れそう

判定して、最終的に0(保留)か1(承認)か’spam’(スパム)か’trash’(ゴミ箱)を返せば良いのか

受け取りデータは第一引数に現在の承認状態(優先度10にしておけば先にWordPressのスパムチェックが入る)、第二引数に投稿されたコメントデータが入っています

コメントデータに格納されている情報

WordPressも使いだして2年目だけどコメントデータとか触った覚えが・・適当にコメントして吐き出してみた

array(14) { [“comment_post_ID”]=> int(755) [“comment_author”]=> string(0) “” [“comment_author_email”]=> string(0) “” [“comment_author_url”]=> string(0) “” [“comment_content”]=> string(15) “テストです” [“comment_type”]=> string(0) “” [“comment_parent”]=> int(0) [“user_ID”]=> int(0) [“user_id”]=> int(0) [“comment_author_IP”]=> string(13) “123.11.111.11” [“comment_agent”]=> string(115) “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36” [“comment_date”]=> string(19) “2019-03-10 21:20:27” [“comment_date_gmt”]=> string(19) “2019-03-10 12:20:27” [“filtered”]=> bool(true) }

comment_post_ID記事ID
comment_authorコメント投稿者名
comment_author_emailEメール
comment_author_urlURL
comment_content本文
comment_type空白でコメント、pingback、trackback
comment_parent親コメントの ID(返信時)
user_IDユーザーID(wordpressログイン時)
user_idユーザーID(wordpressログイン時)
comment_author_IPIPアドレス
comment_dateコメント日時(2019-03-10 00:00:00)
comment_date_gmtコメント日時(2019-03-10 00:00:00)
filteredtrue/false

なるほどです

スパムチェックするPHPコード作成

function comment_check( $approved , $commentdata) {

  //スパムチェック処理

  return $approved;

}

add_filter( 'pre_comment_approved', 'comment_check', 10, 3 );

とりあえずは日本語のない本文だった時弾けれれば、という感じなので使うのは「comment_content(本文)」とトラックバックやピンバックを弾かない様に「comment_type」ですかね

function comment_check( $approved , $commentdata) {

  if($commentdata['comment_type'] == ''){
    //スパムチェック処理
  }

  return $approved;
}

add_filter( 'pre_comment_approved', 'comment_check', 10, 3 );

で、commentdata[‘comment_content’]に日本語が含まれているかどうか判別

functions.php

function comment_check( $approved , $commentdata) {

  if($commentdata['comment_type'] == ''){

    if(strlen($commentdata['comment_content']) == mb_strlen($commentdata['comment_content'],'utf8')) {
      $approved = 'spam';
    }

}

return $approved;

}

add_filter( 'pre_comment_approved', 'comment_check', 10, 3 );

これで機能してくれれば、とりあえずはこれだけで良い

上記は文字の長さからマルチバイト文字が含まれているか判別しているだけですので全角記号とかが入ってるとスパム判定になりません

日本語に限定するなら以下で。

function comment_check( $approved , $commentdata) {

  if($commentdata['comment_type'] == ''){

    if(preg_match( "/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+/u", $str) ){
      $approved = 'spam';
    }

}

return $approved;

}

add_filter( 'pre_comment_approved', 'comment_check', 10, 3 );

スパムチェックできてるか検証

試しにreturnの替わりにdie(“”.$approved)を入れて検証してみます

※初期値の0は空になるのでdie出力は文字列にしてます

日本語入りのコメントでテスト投稿した結果

日本語入りコメント
日本語入りコメント

英語のみのコメントでテスト投稿した結果

英語のみのコメント
英語のみ

return $approvedに戻して、コメントしてみた結果、無事日本語入りのコメントは通常フォルダに、英語のみのコメントはスパムフォルダに入っていました

日本語入りコメント
日本語入り
英語のみのコメント
英語のみ

スパムリストにも入れない

コメントのスパムリストに入る事自体、うざったい感があるので、よっぽど確認する必要がなければ処理を止めてスパムリストにも入れない手もあります

functions.php

function comment_check( $approved , $commentdata) {

  if($commentdata['comment_type'] == ''){

    if(strlen($commentdata['comment_content']) == mb_strlen($commentdata['comment_content'],'utf8')) {
      die('You are spam');
    }

}

return $approved;

}

add_filter( 'pre_comment_approved', 'comment_check', 10, 3 );

余談「Akismet Anti-Spamに思うこと」

WordPressを利用する上でコメントスパム対策に「Akismet Anti-Spam」が必須プラグインとしていつでもどこでも紹介されていますし、紹介するまでもなく(レンタルサーバーでインストールすると?)WordPressに最初からプリインストールされてます

しかしながら、「Akismet Anti-Spam」ってイマイチ納得がいかない私です

スパムコメント弾くって処理するってだけの事に、認証キーが必要だったり、グラフまで用意して「今月は何件スパムとして処理しました!」とかアピールしてきたり、あんな大掛かりな仕組みが必要なのですかね・・って思ってしまうんですよね

加えて、いままでいくつかのブログを作っては放置してを繰り返してきた体感

今までそんなスパムコメント来てなかったブログだったのに「Akismet Anti-Spam」使いだして少し更新してると、めっちゃ届きだしたり

いや検証などしておりませんですし、完全に妄想なんですけど、「Akismet Anti-Spam」を有効にした事あるブログは無効にするとめちゃくちゃスパムコメントが来る様になる気がしてるんですよね

正直、ちょっと「スパムコメント送り込んできていないか」と、怪しく感じてるという

インストール500万超えという絶対的プラグインがまさかまさかの話なんですけどね

2019-04-11WordPressWordPressカスタマイズ

Posted by Yousuke.U