「ブログにコメント欄、付けられますか」。リニューアルの要件を詰めている最中に、クライアント側から出てくる一言です。実装そのものはコンポーネントを2つ置くだけで終わる。厄介なのはその後で、誰かが毎日それを見張る仕事が増えます。

EmDash(AstroネイティブのヘッドレスCMS)のコメント機能を実装まで追って、付ける前に決めておくことを整理しました。判断の材料はどこで止めるか・誰が見るか・何を預かるかの3つです。

既定はオフ。決めるのはコレクション単位の4つ

コメント用のテーブルはインストール時点で作られますが、機能は全コレクションでオフから始まります。私のサイトも blog_posts・projects・pages の3つとも受け付けはオフのまま、コメントは0件。オフのコレクションは公開APIが 403 を返し、表示コンポーネントも空を返すので、置いたままでも何も起きません。

決めるのは4つ。

  • 受け付けるか(既定オフ)
  • 承認の仕方:全部保留 / 初回だけ保留 / 保留なし(既定は初回だけ)
  • 受付を閉じるまでの日数:公開日から90日が既定。0にすると閉じない
  • CMSにログイン中のユーザーを素通しするか(既定オン)
コレクション単位で決める4つの設定を並べた図

表示側は emdash/ui の Comments と CommentForm がそのまま使えます。サーバー側で描画するので一覧のためにAPIを叩きに行かない。返信は1階層までで、返信への返信は元のコメントにぶら下がります。

「初回だけ保留」はスパム対策ではなく、常連の待ち時間を減らす設定

「初回だけ保留」の中身は、同じメールアドレスで承認済みのコメントが1件でもあるかという判定だけです。メールアドレスを変えれば毎回「初回」になるので、これはスパム対策ではなく常連の待ち時間を減らす設定と考えたほうが実態に合います。

保留になった分は管理画面の受信箱に溜まり、承認・スパム・ゴミ箱・削除をまとめて操作できます。ここで効いてくるのが権限で、コメントを触れるのは Editor(編集者)以上。クライアントのアカウントを一段下の役割で作ると、コメントの承認画面にそもそも入れません。役割の切り分けはクライアントに管理画面をどこまで渡すかに書いたとおり、渡す前に決めておく話です。

スパムは減るが、最後は人が見る

ハニーポットとTurnstileを重ねる考え方は問い合わせフォームと同じで、そちらはフォームのスパム対策にまとめました。コメント側の実装で違うのは3点です。

  • 罠にかかった送信は、静かに捨てる。人には見えない項目に値が入っていたら、保存せずに「受け付けました」とだけ返す。弾いたことをbotに教えません。
  • 同じIPからは10分に5件まで。IPはそのまま持たず、ハッシュ化した値で数えます。
  • Turnstileは秘密鍵を環境変数に置いたときだけ有効。置いた後は、検証に失敗した送信も、検証サーバーに繋がらなかった送信も落ちます(fail closed)。逆に鍵を置かなければ、フォームにウィジェットを出してもトークンは検証されません。

自動で止まるのはここまで。残りは人の目で、という前提で運用を組みます。

コメント送信から公開までの4つの関門を並べた図

集めた瞬間から「預かり物」になる

投稿にはメールアドレスが必須です。公開側に出るのは名前・本文・日時だけで、メールアドレスとIPのハッシュは管理画面の中にとどまります。IPは平文で保存せず、サイトごとに違うソルトを混ぜたSHA-256で持つ作りです。

公開ページに出る情報と管理画面だけに残る情報の比較表

それでも、預かる事実は変わりません。プライバシーポリシーの記載と保管方針は、コメント欄を開ける前に決めておきたい。削除は物理削除で、親を消すと返信もまとめて消えます。記事の下書きやリビジョンのような戻し方は無いので、ここは慎重に。

開ける前に確認する3つ

  1. 移行でコメントが付いてこないことがある。EmDashのWXR(WordPressのエクスポートXML)取り込みは、投稿ごとの「コメントを受け付けるか」は読みますが、コメント本体は読みません。過去のコメントを運ぶのはWordPressプラグイン経由の取り込みルートです。「10年分のコメントも移してほしい」なら、入口の選択で結果が決まります。
  2. 承認した瞬間に出るとは限らない。表示までにキャッシュの層を挟みます。反映の考え方はCMSで更新したのに反映されないと同じ切り分けになります。
  3. 投稿リンクの扱い。コメントのような投稿内のリンクには、CMS側で自動的に nofollow か同等の注釈を付けることを推奨しています。EmDashの表示コンポーネントは本文中のURLを rel="nofollow ugc noopener" で自動リンクするので、ここは標準で満たせます。

コメント欄は、機能を足す判断ではなく運用を足す判断です。誰が毎日見るのか決まっていないなら、閉じたまま始めて、記事の反応は問い合わせ導線で拾う——という選び方も十分あり得ます。

制作会社・デザイン会社の方で、ヘッドレスCMSの実装や「付けた後の運用まで含めた設計」を相談したい方は、お問い合わせからお気軽にご連絡ください。

本記事は2026年9月時点の情報です。