2026年10月11日

2026年10月11日

WordPressのコメント機能を設定・カスタマイズする方法

はじめに

「コメントスパムが大量に届いて管理が大変」「コメントフォームのデザインをカスタマイズしたい」「特定の投稿タイプだけコメントを無効にしたい」——WordPressのコメント機能は設定次第でスパムを大幅に減らし、UXを向上させることができます。

症状・原因

WordPressのコメント機能はデフォルトで有効ですが、スパム対策が不十分だとスパムコメントが蓄積し管理コストが増加します。また、フォームのデザインがテーマに合っていないケースも多いです。

解決手順

ステップ1:コメントの基本設定を最適化する

【設定 → ディスカッション で確認する項目】

■ コメント全般設定
  ✅ 新しい記事へのコメントを許可する
  ✅ コメント投稿者が名前とメールアドレスを記入必須にする
  ✅ すでに承認されたコメントの投稿者のコメントを許可し…
  ✅ コメントの手動承認を必須にする(スパム対策に重要)
  ☐ コメント投稿者がWordPressに登録が必要(一般サイトは不要)

■ スパム対策
  ✅ 2つ以上のリンクを含むコメントをモデレートキューに入れる
  コメントが承認待ちになる単語(1行に1つ):
    casino, viagra, loan, debt, click here, buy now

■ メール通知
  ✅ コメントが投稿されたとき
  ✅ コメントがモデレーション待ちになったとき

■ アバター
  デフォルトアバター: Mystery Person(匿名感を出さない場合はBlankを選択)

ステップ2:Akismetでスパムを自動除去する

【Akismetプラグインの設定】

1. プラグイン → インストール済みプラグイン → Akismet Anti-Spam → 有効化
2. Akismet.com でAPI Keyを取得(個人ブログは無料)
3. Akismet設定 → APIキーを入力 → 接続

【Akismetの動作】
- スパムと判定されたコメントは自動的にスパムフォルダへ
- 管理画面 → コメント → スパム で確認・手動削除できる
- スパムは30日後に自動削除される

【追加のスパム対策: コメントのハニーポット】
// functions.php: コメントフォームにハニーポットを追加
add_action( 'comment_form_after_fields', function() {
    echo '<p style="display:none;">
        <label for="website_url_check">Website</label>
        <input type="text" name="website_url_check" id="website_url_check" value="" tabindex="-1" autocomplete="off">
    </p>';
} );

// コメント保存前にハニーポットを検証
add_action( 'pre_comment_on_post', function( $post_id ) {
    if ( ! empty( $_POST['website_url_check'] ) ) {
        wp_die(
            'スパムとして検出されました。',
            'スパム検出',
            [ 'response' => 403, 'back_link' => true ]
        );
    }
} );

ステップ3:コメントフォームをカスタマイズする

// functions.php: comment_form()の出力をカスタマイズ
add_filter( 'comment_form_defaults', function( $defaults ) {
    $defaults['title_reply']          = 'コメントを投稿';
    $defaults['title_reply_to']       = '%s に返信';
    $defaults['cancel_reply_link']    = 'キャンセル';
    $defaults['label_submit']         = 'コメントを送信';
    $defaults['comment_notes_before'] = '<p class="comment-notes">メールアドレスは公開されません。</p>';
    $defaults['comment_notes_after']  = '';

    return $defaults;
} );

// フィールドをカスタマイズ
add_filter( 'comment_form_fields', function( $fields ) {
    // 並び順を変更(コメント→名前→メール→URL)
    $order = [ 'comment', 'author', 'email', 'url' ];
    $sorted = [];
    foreach ( $order as $key ) {
        if ( isset( $fields[ $key ] ) ) {
            $sorted[ $key ] = $fields[ $key ];
        }
    }

    // URLフィールドを削除(スパムに使われやすいため)
    unset( $sorted['url'] );

    return $sorted;
} );

// コメントフィールドのHTMLを変更
add_filter( 'comment_form_field_comment', function( $field ) {
    $field = '<div class="comment-form-comment">
        <label for="comment">コメント <span class="required">*</span></label>
        <textarea id="comment" name="comment" cols="45" rows="6"
                  placeholder="コメントを入力してください..."
                  required></textarea>
    </div>';
    return $field;
} );

ステップ4:コメント一覧の表示をカスタマイズする

<?php
// comments.php: カスタムコメントテンプレート
?>

<div id="comments" class="comments-area">

    <?php if ( have_comments() ) : ?>
        <h2 class="comments-title">
            <?php
            printf(
                '<span>%d</span> 件のコメント',
                get_comments_number()
            );
            ?>
        </h2>

        <ol class="comment-list">
            <?php
            wp_list_comments( [
                'style'       => 'ol',
                'short_ping'  => true,
                'avatar_size' => 48,
                'callback'    => 'my_comment_callback', // カスタムコールバック
            ] );
            ?>
        </ol>

        <?php the_comments_pagination( [
            'prev_text' => '← 前のコメント',
            'next_text' => '次のコメント →',
        ] ); ?>

    <?php endif; ?>

    <?php if ( comments_open() ) : ?>
        <?php comment_form(); ?>
    <?php else : ?>
        <p class="no-comments">コメントは受け付けていません。</p>
    <?php endif; ?>

</div>
// functions.php: カスタムコメントコールバック
function my_comment_callback( $comment, $args, $depth ) {
    $tag = ( 'div' === $args['style'] ) ? 'div' : 'li';
    ?>
    <<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( 'comment-item', $comment ); ?>>
        <article class="comment-body">
            <header class="comment-meta">
                <div class="comment-author">
                    <?php echo get_avatar( $comment, $args['avatar_size'] ); ?>
                    <span class="author-name"><?php comment_author(); ?></span>
                </div>
                <time class="comment-time" datetime="<?php comment_date( 'c' ); ?>">
                    <?php comment_date( 'Y年n月j日' ); ?>
                </time>
            </header>

            <?php if ( '0' === $comment->comment_approved ) : ?>
                <p class="comment-awaiting-moderation">承認待ちのコメントです。</p>
            <?php endif; ?>

            <div class="comment-content">
                <?php comment_text(); ?>
            </div>

            <footer class="comment-footer">
                <?php comment_reply_link( array_merge( $args, [
                    'depth'     => $depth,
                    'max_depth' => $args['max_depth'],
                    'before'    => '<div class="reply">',
                    'after'     => '</div>',
                ] ) ); ?>
            </footer>
        </article>
    <?php
}

ステップ5:特定の投稿タイプのコメントを一括無効化する

// functions.php: 特定条件でコメントを無効化

// 特定の投稿タイプのコメントを無効化
add_filter( 'comments_open', function( $open, $post_id ) {
    $post_type = get_post_type( $post_id );

    // ポートフォリオと固定ページはコメント無効
    if ( in_array( $post_type, [ 'portfolio', 'page' ], true ) ) {
        return false;
    }

    return $open;
}, 10, 2 );

// 古い投稿のコメントを自動的に閉じる
// 設定 → ディスカッション → 「投稿日から X 日後にコメントを自動的に閉じる」でも可能

// 既存の全固定ページのコメントをWP-CLIで一括無効化
// wp post list --post_type=page --format=ids | xargs wp post update --comment_status=closed

// コメント数のバッジを管理バーから非表示
add_action( 'wp_before_admin_bar_render', function() {
    global $wp_admin_bar;
    $wp_admin_bar->remove_menu( 'comments' );
} );

// コメント機能を完全に無効化する場合
add_action( 'init', function() {
    // コメントタイプを削除
    remove_post_type_support( 'post', 'comments' );
    remove_post_type_support( 'page', 'comments' );
} );

add_filter( 'wp_headers', function( $headers ) {
    unset( $headers['X-Pingback'] );
    return $headers;
} );

注意事項

  • コメントスパムはAkismet単体でも大幅に削減できますが、高負荷サイトではコメント投稿にreCAPTCHAを追加するとさらに効果的です。
  • comments_openフィルターは表示条件のみを制御します。既存の投稿に保存されたコメント設定を変更するには、データベースのcomment_statusカラムを更新するかWP-CLIを使います。
  • コメントページネーションは設定 → ディスカッション → 「コメントを○ページに分割する」で有効化できます。コメントが多いページのパフォーマンス改善に効果的です。

まとめ

コメント機能のカスタマイズは「ディスカッション設定で承認必須・スパムワードを設定→Akismetでスパム自動除去→ハニーポットで追加対策→comment_form_fieldsでフォームを整備→wp_list_commentsとカスタムコールバックで表示デザインを改善」の流れで整備します。関連記事:WordPressのメディアライブラリを整理・管理する方法、WordPressのお問い合わせフォーム(CF7)をカスタマイズする方法。

お気軽にご相談ください

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