comment_form( array $args = array(), int|WP_Post $post = null )

Outputs a complete commenting form for use within a template.

Description

Most strings and form fields may be controlled through the $args array passed into the function, while you may also choose to use the ‘comment_form_default_fields’ filter to modify the array of default fields if you’d just like to add a new one or remove a single field. All fields are also individually passed through a filter of the ‘comment_form_field_$name’ where $name is the key used in the array of fields.

Parameters

$args

array

Optional

Default arguments and form fields to override.

fields array Default comment fields, filterable by default via the 'comment_form_default_fields' hook.

author stringComment author field HTML.

email stringComment author email field HTML.

url stringComment author URL field HTML.

cookies stringComment cookie opt-in field HTML.

comment_field stringThe comment textarea field HTML.

must_log_in stringHTML element for a "must be logged in to comment" message.

logged_in_as stringThe HTML for the "logged in as [user]" message, the Edit profile link, and the Log out link.

comment_notes_before stringHTML element for a message displayed before the comment fields if the user is not logged in.

Default "Your email address will not be published.".

comment_notes_after stringHTML element for a message displayed after the textarea field.

action stringThe comment form element action attribute. Default "/wp-comments-post.php".

id_form stringThe comment form element id attribute. Default "commentform".

id_submit stringThe comment submit element id attribute. Default "submit".

class_container stringThe comment form container class attribute. Default "comment-respond".

class_form stringThe comment form element class attribute. Default "comment-form".

class_submit stringThe comment submit element class attribute. Default "submit".

name_submit stringThe comment submit element name attribute. Default "submit".

title_reply stringThe translatable "reply" button label. Default "Leave a Reply".

title_reply_to stringThe translatable "reply-to" button label. Default "Leave a Reply to %s", where %s is the author of the comment being replied to.

title_reply_before stringHTML displayed before the comment form title.

Default: <h3 id="reply-title" class="comment-reply-title">.

title_reply_after stringHTML displayed after the comment form title.

Default: </h3>.

cancel_reply_before stringHTML displayed before the cancel reply link.

cancel_reply_after stringHTML displayed after the cancel reply link.

cancel_reply_link stringThe translatable "cancel reply" button label. Default "Cancel reply".

label_submit stringThe translatable "submit" button label. Default "Post a comment".

submit_button stringHTML format for the Submit button.

Default: <input name="%1$s" type="submit" id="%2$s" class="%3$s" value="%4$s" />.

submit_field stringHTML format for the markup surrounding the Submit button and comment hidden fields. Default: <p class="form-submit">%1$s %2$s</p>, where %1$s is the submit button markup and %2$s is the comment hidden fields.

format stringThe comment form format. Default "xhtml". Accepts "xhtml", "html5".

Default: array()

$post

int|WP_Post

Optional

Post ID or WP_Post object to generate the form for. Default current post.

Default: null

Source

File: wp-includes/comment-template.php.

View all references

function comment_form( $args = array(), $post = null ) {

$post = get_post( $post );

// Exit the function if the post is invalid or comments are closed.

if ( ! $post || ! comments_open( $post ) ) {

/**

* Fires after the comment form if comments are closed.

*

* For backward compatibility, this action also fires if comment_form()

* is called with an invalid post object or ID.

*

* @since 3.0.0

*/

do_action( "comment_form_comments_closed" );

return;

}

$post_id = $post->ID;

$commenter = wp_get_current_commenter();

$user = wp_get_current_user();

$user_identity = $user->exists() ? $user->display_name : "";

$args = wp_parse_args( $args );

if ( ! isset( $args["format"] ) ) {

$args["format"] = current_theme_supports( "html5", "comment-form" ) ? "html5" : "xhtml";

}

$req = get_option( "require_name_email" );

$html5 = "html5" === $args["format"];

// Define attributes in HTML5 or XHTML syntax.

$required_attribute = ( $html5 ? " required" : " required="required"" );

$checked_attribute = ( $html5 ? " checked" : " checked="checked"" );

// Identify required fields visually and create a message about the indicator.

$required_indicator = " " . wp_required_field_indicator();

$required_text = " " . wp_required_field_message();

$fields = array(

"author" => sprintf(

"<p class="comment-form-author">%s %s</p>",

sprintf(

"<label for="author">%s%s</label>",

__( "Name" ),

( $req ? $required_indicator : "" )

),

sprintf(

"<input id="author" name="author" type="text" value="%s" size="30" maxlength="245" autocomplete="name"%s />",

esc_attr( $commenter["comment_author"] ),

( $req ? $required_attribute : "" )

)

),

"email" => sprintf(

"<p class="comment-form-email">%s %s</p>",

sprintf(

"<label for="email">%s%s</label>",

__( "Email" ),

( $req ? $required_indicator : "" )

),

sprintf(

"<input id="email" name="email" %s value="%s" size="30" maxlength="100" aria-describedby="email-notes" autocomplete="email"%s />",

( $html5 ? "type="email"" : "type="text"" ),

esc_attr( $commenter["comment_author_email"] ),

( $req ? $required_attribute : "" )

)

),

"url" => sprintf(

"<p class="comment-form-url">%s %s</p>",

sprintf(

"<label for="url">%s</label>",

__( "Website" )

),

sprintf(

"<input id="url" name="url" %s value="%s" size="30" maxlength="200" autocomplete="url" />",

( $html5 ? "type="url"" : "type="text"" ),

esc_attr( $commenter["comment_author_url"] )

)

),

);

if ( has_action( "set_comment_cookies", "wp_set_comment_cookies" ) && get_option( "show_comments_cookies_opt_in" ) ) {

$consent = empty( $commenter["comment_author_email"] ) ? "" : $checked_attribute;

$fields["cookies"] = sprintf(

"<p class="comment-form-cookies-consent">%s %s</p>",

sprintf(

"<input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes"%s />",

$consent

),

sprintf(

"<label for="wp-comment-cookies-consent">%s</label>",

__( "Save my name, email, and website in this browser for the next time I comment." )

)

);

// Ensure that the passed fields include cookies consent.

if ( isset( $args["fields"] ) && ! isset( $args["fields"]["cookies"] ) ) {

$args["fields"]["cookies"] = $fields["cookies"];

}

}

/**

* Filters the default comment form fields.

*

* @since 3.0.0

*

* @param string[] $fields Array of the default comment fields.

*/

$fields = apply_filters( "comment_form_default_fields", $fields );

$defaults = array(

"fields" => $fields,

"comment_field" => sprintf(

"<p class="comment-form-comment">%s %s</p>",

sprintf(

"<label for="comment">%s%s</label>",

_x( "Comment", "noun" ),

$required_indicator

),

"<textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525"" . $required_attribute . "></textarea>"

),

"must_log_in" => sprintf(

"<p class="must-log-in">%s</p>",

sprintf(

/* translators: %s: Login URL. */

__( "You must be <a href="%s">logged in</a> to post a comment." ),

/** This filter is documented in wp-includes/link-template.php */

wp_login_url( apply_filters( "the_permalink", get_permalink( $post_id ), $post_id ) )

)

),

"logged_in_as" => sprintf(

"<p class="logged-in-as">%s%s</p>",

sprintf(

/* translators: 1: User name, 2: Edit user link, 3: Logout URL. */

__( "Logged in as %1$s. <a href="%2$s">Edit your profile</a>. <a href="%3$s">Log out?</a>" ),

$user_identity,

get_edit_user_link(),

/** This filter is documented in wp-includes/link-template.php */

wp_logout_url( apply_filters( "the_permalink", get_permalink( $post_id ), $post_id ) )

),

$required_text

),

"comment_notes_before" => sprintf(

"<p class="comment-notes">%s%s</p>",

sprintf(

"<span id="email-notes">%s</span>",

__( "Your email address will not be published." )

),

$required_text

),

"comment_notes_after" => "",

"action" => site_url( "/wp-comments-post.php" ),

"id_form" => "commentform",

"id_submit" => "submit",

"class_container" => "comment-respond",

"class_form" => "comment-form",

"class_submit" => "submit",

"name_submit" => "submit",

"title_reply" => __( "Leave a Reply" ),

/* translators: %s: Author of the comment being replied to. */

"title_reply_to" => __( "Leave a Reply to %s" ),

"title_reply_before" => "<h3 id="reply-title" class="comment-reply-title">",

"title_reply_after" => "</h3>",

"cancel_reply_before" => " <small>",

"cancel_reply_after" => "</small>",

"cancel_reply_link" => __( "Cancel reply" ),

"label_submit" => __( "Post Comment" ),

"submit_button" => "<input name="%1$s" type="submit" id="%2$s" class="%3$s" value="%4$s" />",

"submit_field" => "<p class="form-submit">%1$s %2$s</p>",

"format" => "xhtml",

);

/**

* Filters the comment form default arguments.

*

* Use {@see "comment_form_default_fields"} to filter the comment fields.

*

* @since 3.0.0

*

* @param array $defaults The default comment form arguments.

*/

$args = wp_parse_args( $args, apply_filters( "comment_form_defaults", $defaults ) );

// Ensure that the filtered arguments contain all required default values.

$args = array_merge( $defaults, $args );

// Remove `aria-describedby` from the email field if there"s no associated description.

if ( isset( $args["fields"]["email"] ) && false === strpos( $args["comment_notes_before"], "id="email-notes"" ) ) {

$args["fields"]["email"] = str_replace(

" aria-describedby="email-notes"",

"",

$args["fields"]["email"]

);

}

/**

* Fires before the comment form.

*

* @since 3.0.0

*/

do_action( "comment_form_before" );

?>

<div id="respond" class="<?php echo esc_attr( $args["class_container"] ); ?>">

<?php

echo $args["title_reply_before"];

comment_form_title( $args["title_reply"], $args["title_reply_to"], true, $post_id );

if ( get_option( "thread_comments" ) ) {

echo $args["cancel_reply_before"];

cancel_comment_reply_link( $args["cancel_reply_link"] );

echo $args["cancel_reply_after"];

}

echo $args["title_reply_after"];

if ( get_option( "comment_registration" ) && ! is_user_logged_in() ) :

echo $args["must_log_in"];

/**

* Fires after the HTML-formatted "must log in after" message in the comment form.

*

* @since 3.0.0

*/

do_action( "comment_form_must_log_in_after" );

else :

printf(

"<form action="%s" method="post" id="%s" class="%s"%s>",

esc_url( $args["action"] ),

esc_attr( $args["id_form"] ),

esc_attr( $args["class_form"] ),

( $html5 ? " novalidate" : "" )

);

/**

* Fires at the top of the comment form, inside the form tag.

*

* @since 3.0.0

*/

do_action( "comment_form_top" );

if ( is_user_logged_in() ) :

/**

* Filters the "logged in" message for the comment form for display.

*

* @since 3.0.0

*

* @param string $args_logged_in The HTML for the "logged in as [user]" message,

* the Edit profile link, and the Log out link.

* @param array $commenter An array containing the comment author"s

* username, email, and URL.

* @param string $user_identity If the commenter is a registered user,

* the display name, blank otherwise.

*/

echo apply_filters( "comment_form_logged_in", $args["logged_in_as"], $commenter, $user_identity );

/**

* Fires after the is_user_logged_in() check in the comment form.

*

* @since 3.0.0

*

* @param array $commenter An array containing the comment author"s

* username, email, and URL.

* @param string $user_identity If the commenter is a registered user,

* the display name, blank otherwise.

*/

do_action( "comment_form_logged_in_after", $commenter, $user_identity );

else :

echo $args["comment_notes_before"];

endif;

// Prepare an array of all fields, including the textarea.

$comment_fields = array( "comment" => $args["comment_field"] ) + (array) $args["fields"];

/**

* Filters the comment form fields, including the textarea.

*

* @since 4.4.0

*

* @param array $comment_fields The comment fields.

*/

$comment_fields = apply_filters( "comment_form_fields", $comment_fields );

// Get an array of field names, excluding the textarea.

$comment_field_keys = array_diff( array_keys( $comment_fields ), array( "comment" ) );

// Get the first and the last field name, excluding the textarea.

$first_field = reset( $comment_field_keys );

$last_field = end( $comment_field_keys );

foreach ( $comment_fields as $name => $field ) {

if ( "comment" === $name ) {

/**

* Filters the content of the comment textarea field for display.

*

* @since 3.0.0

*

* @param string $args_comment_field The content of the comment textarea field.

*/

echo apply_filters( "comment_form_field_comment", $field );

echo $args["comment_notes_after"];

} elseif ( ! is_user_logged_in() ) {

if ( $first_field === $name ) {

/**

* Fires before the comment fields in the comment form, excluding the textarea.

*

* @since 3.0.0

*/

do_action( "comment_form_before_fields" );

}

/**

* Filters a comment form field for display.

*

* The dynamic portion of the hook name, `$name`, refers to the name

* of the comment form field.

*

* Possible hook names include:

*

* - `comment_form_field_comment`

* - `comment_form_field_author`

* - `comment_form_field_email`

* - `comment_form_field_url`

* - `comment_form_field_cookies`

*

* @since 3.0.0

*

* @param string $field The HTML-formatted output of the comment form field.

*/

echo apply_filters( "comment_form_field_{$name}", $field ) . "n";

if ( $last_field === $name ) {

/**

* Fires after the comment fields in the comment form, excluding the textarea.

*

* @since 3.0.0

*/

do_action( "comment_form_after_fields" );

}

}

}

$submit_button = sprintf(

$args["submit_button"],

esc_attr( $args["name_submit"] ),

esc_attr( $args["id_submit"] ),

esc_attr( $args["class_submit"] ),

esc_attr( $args["label_submit"] )

);

/**

* Filters the submit button for the comment form to display.

*

* @since 4.2.0

*

* @param string $submit_button HTML markup for the submit button.

* @param array $args Arguments passed to comment_form().

*/

$submit_button = apply_filters( "comment_form_submit_button", $submit_button, $args );

$submit_field = sprintf(

$args["submit_field"],

$submit_button,

get_comment_id_fields( $post_id )

);

/**

* Filters the submit field for the comment form to display.

*

* The submit field includes the submit button, hidden fields for the

* comment form, and any wrapper markup.

*

* @since 4.2.0

*

* @param string $submit_field HTML markup for the submit field.

* @param array $args Arguments passed to comment_form().

*/

echo apply_filters( "comment_form_submit_field", $submit_field, $args );

/**

* Fires at the bottom of the comment form, inside the closing form tag.

*

* @since 1.5.0

*

* @param int $post_id The post ID.

*/

do_action( "comment_form", $post_id );

echo "</form>";

endif;

?>

</div><!-- #respond -->

<?php

/**

* Fires after the comment form.

*

* @since 3.0.0

*/

do_action( "comment_form_after" );

}

Leave a Reply

Your email address will not be published. Required fields are marked *