2026年5月20日

2026年5月20日

WordPressのスパムコメントを防止する方法

はじめに

WordPressのコメント欄はスパムボットの格好の標的です。対策なしでは一日に数百件のスパムコメントが届くこともあります。Akismet・ハニーポット・reCAPTCHAを組み合わせることでスパムをほぼ完全に防止できます。

症状・原因

  • スパムコメントが大量に届いてモデレーションが追いつかない
  • 承認待ちコメント数が増え続けてダッシュボードに大量通知が来る
  • スパムボットによってサーバー負荷が高くなっている
  • コメントフォームに不審なリンクや広告が投稿される

解決手順

ステップ1:コメント設定を強化する(管理画面)

設定 → ディスカッション での推奨設定:

コメントモデレーション:
  ✓ コメントの手動承認を必須にする
  ✓ すでに承認されたコメントの投稿者のみ即時公開
  ✓ 2個以上のリンクを含むコメントはモデレーションキューに入れる

コメント通知:
  ✓ コメントが投稿されたらメールで通知(モデレーション用)

アバター:
  デフォルトアバター → 「ミステリーパーソン」(外部URL読み込み削減)

ステップ2:Akismet でスパムをフィルタリングする

Akismet 設定手順:
1. プラグイン → Akismet Anti-Spam を有効化
2. Akismet.com でAPIキーを取得(個人ブログは無料)
3. プラグイン → Akismet → APIキーを入力
4. 「スパムを自動的に削除」の設定:
   - スパム確認済みコメントを30日後に自動削除 → ON
   - スパムレビューページに投稿者情報を表示 → ON

ステップ3:ハニーポットでボットをトラップする

// functions.php

// ハニーポットフィールドをコメントフォームに追加
add_filter('comment_form_default_fields', function (array $fields): array {
    // CSSで非表示にする隠しフィールド(ボットは入力する)
    $fields['honeypot'] = '<p class="hp-field" aria-hidden="true" style="display:none!important;position:absolute;left:-9999px;">'
        . '<label for="hp_name">お名前(入力しないでください)</label>'
        . '<input type="text" name="hp_name" id="hp_name" value="" autocomplete="off" tabindex="-1">'
        . '</p>';
    return $fields;
});

// ハニーポットに値が入っていたらスパムとして拒否
add_filter('preprocess_comment', function (array $comment_data): array {
    if (!empty($_POST['hp_name'])) {
        wp_die(
            'スパムとして検出されました。',
            'スパム検出',
            ['response' => 403, 'back_link' => true]
        );
    }
    return $comment_data;
});

ステップ4:コメント投稿時の検証を強化する

// functions.php

// ログインユーザー以外のコメントにURLを禁止
add_filter('preprocess_comment', function (array $comment_data): array {
    if (is_user_logged_in()) {
        return $comment_data;
    }

    $content = $comment_data['comment_content'] ?? '';

    // URLを含むコメントをブロック(非ログインユーザー)
    if (preg_match('/(https?:\/\/|www\.)/i', $content)) {
        wp_die(
            'URLを含むコメントは投稿できません。',
            'コメントエラー',
            ['response' => 403, 'back_link' => true]
        );
    }

    // 短すぎるコメントをブロック
    if (mb_strlen(trim($content)) < 10) {
        wp_die(
            'コメントが短すぎます。10文字以上入力してください。',
            'コメントエラー',
            ['response' => 400, 'back_link' => true]
        );
    }

    return $comment_data;
});

// コメント投稿時間のチェック(ボットは即座に送信する)
add_action('comment_form', function (): void {
    echo '<input type="hidden" name="comment_timestamp" value="' . esc_attr(time()) . '">';
});

add_filter('preprocess_comment', function (array $comment_data): array {
    $posted_at = (int) ($_POST['comment_timestamp'] ?? 0);
    $elapsed   = time() - $posted_at;

    // 3秒未満での送信はボットとして拒否
    if ($posted_at > 0 && $elapsed < 3) {
        wp_die(
            'コメントの送信が早すぎます。しばらく待ってから再送信してください。',
            'コメントエラー',
            ['response' => 429, 'back_link' => true]
        );
    }

    return $comment_data;
});

ステップ5:古いスパムを一括削除する

// functions.php: WP-CLIコマンドまたはダッシュボードで削除
# WP-CLI でスパムコメントを一括削除
wp comment delete $(wp comment list --status=spam --format=ids) --force

# 承認待ちの古いコメントを削除(90日以上)
wp comment delete $(wp comment list --status=hold --format=ids \
  --date_query='[{"before":"90 days ago","column":"comment_date"}]') --force

# スパムコメント数の確認
wp comment list --status=spam --format=count

# 全スパムを一括削除(確認なし)
wp comment spam --all
wp comment delete --status=spam --all --force

注意事項

  • コメントを完全に無効にすることが最もシンプルなスパム対策です。コメント欄が不要なサイトは設定→ディスカッションでコメントを無効化してください
  • reCAPTCHA v3はユーザーの操作なしにスコアを計算しますが、低スコアのユーザーがコメントできなくなる場合があります。閾値(0.5推奨)を調整してください
  • Akismetは商業サイトは有料プランが必要です(月額$10〜)。個人ブログは無料で利用できます

まとめ

Akismetを有効化してAPIキーを設定するだけで大半のスパムを自動検出できます。ハニーポットフィールドはcomment_form_default_fieldsフィルターで追加し、preprocess_commentで値チェックします。投稿タイムスタンプを hidden フィールドで送信し、3秒未満の投稿をボットとして拒否することでさらに精度が上がります。

お気軽にご相談ください

お見積りへ お問い合わせへ