
comment_id_fields()の用途
comment_id_fields()
は、コメントフォームに必要な隠しフィールド(hidden input)を自動出力するテンプレートタグです。
コメントを投稿する際に WordPress がどの投稿に紐づくコメントか、どのコメントへの返信かを特定するための情報をフォームに埋め込む役割があります。
これを使うことで、コメント送信時に正しいポストIDと返信先IDがサーバーへ送られ、処理されます。
comment_id_fields()の主な用途
コメントフォームを手動で作成する場合に、comment_id_fields()
をフォームタグの中に必ず記述する必要があります。
たとえば、comment_form()
を使う場合は内部で自動的にこれが呼ばれるので特に意識しなくても動作します。
逆に言うと、comment_form()
を使わずにフォームHTMLをすべて自作する場合、この関数を入れないとコメントが正しく処理されません。
comment_id_fields()の出力内容
この関数は以下の2つのhidden inputを出力します。
comment_post_ID
- コメントがどの投稿・ページに属するかを示すID
comment_parent
- 返信先コメントのID(新規コメントの場合は0)
例:
<input type="hidden" name="comment_post_ID" value="123" id="comment_post_ID">
<input type="hidden" name="comment_parent" id="comment_parent" value="0">
これらはコメントの整合性維持に不可欠です。
comment_id_fields()の基本的な使い方
フォームタグの中で呼びます。
<form action="<?php echo site_url('/wp-comments-post.php'); ?>" method="post" id="commentform">
<textarea name="comment"></textarea>
<?php comment_id_fields(); ?>
<input type="submit" value="送信">
</form>
comment_id_fields()
を書くと、コメント送信時に正しいpost ID・parent IDが送られます。
comment_id_fields()のパラメータ
comment_id_fields()
はオプションで $post_id
を受け取れます。
comment_id_fields( int|WP_Post $post_id )
引数を省略すると、グローバル $post
から自動的に現在の投稿IDを取得します。
例:
comment_id_fields(42);
この場合、comment_post_ID
の値は 42
になります。
comment_id_fields()の使用例:手作りフォーム
以下はコメントフォームを完全に手作りした場合のサンプルです。
<form action="<?php echo site_url('/wp-comments-post.php'); ?>" method="post" id="commentform">
<p><label for="author">お名前</label><input type="text" name="author" id="author"></p>
<p><label for="email">メール</label><input type="email" name="email" id="email"></p>
<p><label for="comment">コメント</label><textarea name="comment" id="comment"></textarea></p>
<?php comment_id_fields(); ?>
<p><input type="submit" value="送信"></p>
</form>
この例では
- 投稿IDが自動でセットされる
- 返信機能も問題なく動作する
ようになります。
コメント返信(スレッド)
WordPressでは、コメントをスレッド(ツリー状)にできます。
- 「返信する」をクリックした場合、
comment_parent
に親コメントIDがセットされます。 - 新規コメントの場合は
0
です。
comment_id_fields()
はこの処理を自動で行います。
JavaScriptで返信先を切り替えた場合でも、comment_parent
の値が書き換わる仕組みです。
出力内容のカスタマイズ
隠しフィールドのマークアップはフィルターフック comment_id_fields
で変更できます。
例:クラスを付与する
add_filter('comment_id_fields', function($result, $post_id) {
$result = str_replace('<input ', '<input class="hidden-input" ', $result);
return $result;
}, 10, 2);
get_comment_id_fields()
実は comment_id_fields()
は出力する関数です。
もしHTMLを取得だけしたい場合は get_comment_id_fields()
を使います。
例:
$html = get_comment_id_fields();
echo '<div class="hidden-fields">' . $html . '</div>';
comment_form() との関係
comment_form()
はフォーム全体を出力しますが、その内部で comment_id_fields()
が呼ばれています。
つまり comment_form()
を使っていれば、隠しフィールドは自動で含まれています。
一方、comment_form()
を使わずに独自フォームを作るときは必ず comment_id_fields()
を呼びましょう。
comment_id_fields()のよくある質問
- これを入れないとどうなる?
-
コメント送信時に
- 投稿IDが送られない
- 返信先IDが分からない
ため、WordPressがどの投稿・コメントに紐づけていいのか判断できず、コメントが保存されません。
- 入力値を改ざんされたらどうなる?
-
WordPressコア側でチェックがあり、ユーザーが別の投稿IDやコメントIDを送ると権限確認が行われます。
不正な値の場合はエラーになります。
まとめ
comment_id_fields() のポイント
- コメントフォームの隠しフィールドを出力する
- 投稿ID(comment_post_ID)と返信ID(comment_parent)を自動セット
- 手作りフォームでは必須
comment_form()
を使う場合は自動で呼ばれるので不要- フィルターフックでマークアップをカスタマイズ可能
get_comment_id_fields()
でHTML取得だけも可能