WordPress

【WordPress】Akismet無しのスパム対策(プラグイン無し版)

※少し古い下書きを見つけたので、2025年8月現在の設定内容に修正して公開しています。

ご存じの方も多いですが、Akismetは商用利用不可です。(有償版を使用する必要がある)

当サイトのような低収益の個人ブログも例外ではなく、収益化した時点でAkismetの無償利用はできなくなります。
(このサイトではAdSenseの審査でAkismetのプラグインを削除しました)

今回は、Akismetを外した当サイトのスパム対策を紹介したいと思います。

当サイトは月間1万PV弱の個人ブログで、元々スパムも少なかったため、プラグイン無しの簡単なスパム対策で済ませています。
(あと私が個人的にプラグイン少なめ派なので…)

当サイトでのスパム対策設定

当サイトでは、WordPress標準の設定と、独自のメールアドレス禁止を設定しています。

前者は基本デフォルト設定なので、今回は後者のメールアドレス禁止設定について説明していきます。

メールアドレス禁止設定

設定はいたってシンプルで、
①コメント欄のメールアドレス入力欄を非表示にする
②非表示欄に入力するのはbotだから、メールアドレスが入力されていたらエラーにする

というだけです。

ユーザ登録していない人に返信のメールが届かないという欠点がありますが、個人ブログのコメ欄だとメール登録したくない人が大多数だと思うので、個人ブログという規模感においては欠点は実質0だと思っています。

※↓の設定と相性が良いです

では早速設定方法を紹介していきます。

①コメントのメールアドレス非表示

まずは、WordPressの設定画面でのメールアドレス必須設定をOFFにします。

WordPress管理画面から設定→ディスカッション→他のコメント設定→「コメントの投稿者の名前とメールアドレスの入力を必須にする」のチェックを外す

次に、CSSでメールアドレス欄を非表示にします。

/* コメント欄のメールアドレス・URL・公開の注意書きを非表示にする */
.comment-form-email, .comment-form-url, .comment-notes {
  display: none;
}

※子テーマのCSSに設定してください。環境無くても「外観→カスタマイズ→追加CSS」等で設定可能です。
※.comment-form-url, .comment-notesで、サイトURL入力欄と「公開されません~」の注意書きも非表示にします。

②メールアドレス入力のエラー設定

次にメールアドレス欄が入力されていた場合をエラーに設定します。
これはfunctions.phpに以下の関数を追加します。

// ----------------------------------------------------------------------------
// コメント投稿前にエラーを表示させる
// ----------------------------------------------------------------------------
function mytheme_pre_comment($commentdata) {
  // 非表示にしているメール・サイトの項目が入力されていた場合はスパムかボットなのでエラー
  if (isset($_POST['email']) && strlen($_POST['email'])) {
    wp_die(__('<strong>comment_format_error</strong>: メール欄の検証に失敗しました。'));
  }
  if (isset($_POST['url']) && strlen($_POST['url'])) {
    wp_die(__('<strong>comment_format_error</strong>: サイト欄の検証に失敗しました。'));
  }

  // 問題がなければ、元のコメントデータを返す(処理を続行させる)
  return $commentdata;
}
add_action('preprocess_comment', 'mytheme_pre_comment');

※子テーマのfunctions.phpに設定してください。環境無くても「外観→テーマファイルエディター→Theme Functions」で設定可能です。

この設定で、当サイトのスパムコメントは今のところ全て防ぐことができています。

凄く簡単な設定で、プラグインを使わずにスパム対策ができるので、有償版導入するほどじゃないけどスパム対策をしたい、と悩んでいる方は是非お試しください!

余談

ピンバック・トラックバックの話

上述の設定では、ピンバック・トラックバックもエラーにしてしまう設定になるため、ピンバック・トラックバックを有効にしているサイトでは、mytheme_pre_comment()に以下のif分を追加します。

function mytheme_pre_comment($commentdata) {
  // ここのif分を追加
  if (isset($commentdata['comment_type']) && $commentdata['comment_type'] != 'comment') {
    return $commentdata; // コメントタイプが 'comment' でない場合はそのまま返す
  }
  // 非表示にしているメール・サイトの項目が入力されていた場合はスパムかボットなのでエラー
  if (isset($_POST['email']) && strlen($_POST['email'])) {
    wp_die(__('<strong>comment_format_error</strong>: メール欄の検証に失敗しました。'));
  }
  if (isset($_POST['url']) && strlen($_POST['url'])) {
    wp_die(__('<strong>comment_format_error</strong>: サイト欄の検証に失敗しました。'));
  }

  // 問題がなければ、元のコメントデータを返す(処理を続行させる)
  return $commentdata;
}
add_action('preprocess_comment', 'mytheme_pre_comment');


当サイトも以前は、ピンバック・トラックバックを有効にしており、botはドメインをNGワードに設定して対応していました。
(NGワードは「設定→ディスカッション→コメント内で許可されないキーワード」で設定できます)

ただ、令和の時代に「ピンバック・トラックバック」がどこまで意味あるか分からず、かつ、割と真剣に99.99%がbotなので今は無効に設定しています…

過去に使ってた日本語コメント限定の設定

Akismet止めた当初は、本編で紹介した設定ではなく、日本語コメント以外をNGにする、という割と雑な方法でスパム対策をしていました。

// ----------------------------------------------------------------------------
// コメント投稿前にエラーを表示させる
// ----------------------------------------------------------------------------
function mytheme_pre_comment($commentdata) {
  if (isset($_POST['comment']) && !preg_match("/[ぁ-んァ-ヶア-ン゙゚]+/u", $_POST['comment'])) {
    wp_die(__('<strong>comment_format_error</strong>: コメントは日本語でお願いします。'));
  }

  // 問題がなければ、元のコメントデータを返す(処理を続行させる)
  return $commentdata;
}
add_action('preprocess_comment', 'mytheme_pre_comment');

スパムは体感9割が英語・ロシア語なので↑の方法でもそれなりに防げるんですよね。

https://elearn.jp/wpman/column/c20120131_01.html

コメント

タイトルとURLをコピーしました