comment_form() — функция для вывода формы комментирования

Посмотрите мой видеоурок про то, как реализовать комментарии при создании темы WordPress с нуля.

Функция выводит полноценную форму для комментирования, которую можно использовать в теме сайта.

HTML полей и лейблы можно задать при помощи параметра $args функции, если же вам понадобится удалить одно из стандартных полей или добавить новое, воспользуйтесь фильтром comment_form_default_fields. Кроме того, каждое из полей проходит отдельно через фильтр comment_form_field_$name, где $name — это ID поля, задающийся в параметрах в массиве fields.

comment_form( $args = array(), $post_id = null )

Параметры

$args
(массив) Массив с параметрами полей.
fields
(массив) Содержит HTML стандартных полей формы (кроме поля комментария), можно передать свой произвольный HTML для каждого (какого-либо) поля, удалить одно из стандартных полей или добавить новое. Кроме того, если у вас нет возможности передать этот параметр в функцию, то можете отфильтровать его через comment_form_default_fields.
author
(строка) HTML поля автора комментария.
email
(строка) HTML поля электронной почты.
url
(строка) HTML поля «Сайт».
cookies
(строка) HTML чекбокса согласия с принятием куков автора комментария (включается в Настройки > Обсуждение)
Чуть ниже вы найдёте примеры, как изменить лейбл любого из полей, как удалить поле с сайтом например и как добавить произвольное поле в форму комментирования.
comment_field
(строка) HTML поля комментирования.
must_log_in
(строка) HTML, который будет использоваться в качестве сообщения пользователю, если он не залогинен, а оставлять комментарии могут только залогиненные пользователи (настройка устанавливается в админке в Настройки > Обсуждение).
logged_in_as
(строка) HTML, отображающися для зарегистрированных пользователей «Вы вошли, как…».
comment_notes_before
(строка) Текст или HTML-код, который будет добавляться перед полями ввода для неавторизованных пользователей.
comment_notes_after
(строка) Текст или HTML-код, который будет добавляться после всех полей ввода (в том числе после поля комментария) и перед кнопкой отправки. По умолчанию это список тегов, разрешенных к использованию в тексте комментария.
action
(строка) Атрибут action формы, по умолчанию site_url( '/wp-comments-post.php' ).
id_form
(строка) Атрибут id тега <form>. По умолчанию commentform.
class_form
(строка) CSS-класс формы. По умолчанию comment-form.
class_container
(строка) CSS-класс контейнера с id=»respond». По умолчанию comment-respond
title_reply
(строка) Заголовок формы.
title_reply_to
(строка) Заголовок формы при ответе на другой комментарий.
title_reply_before
(строка) Открывающий тег заголовка формы при ответе на другой коммент, по умолчанию <h3 id="reply-title" class="comment-reply-title">.
title_reply_after
(строка) Закрывающий тег заголовка формы при ответе на другой коммент, по умолчанию </h3>.
cancel_reply_link
(строка) Текст ссылки отмены ответа.
cancel_reply_before
(строка) Открывающий тег ссылки отмены ответа, по умолчанию <small>
cancel_reply_after
(строка) Закрывающий тег ссылки отмены ответа, по умолчанию </small>
label_submit
(строка) Текст кнопки отправки комментария.
id_submit
(строка) Атрибут id кнопки отправки формы. По умолчанию submit.
name_submit
(строка) Атрибут name кнопки отправки формы. По умолчанию submit.
class_submit
(строка) CSS-класс(ы) кнопки отправки формы. По умолчанию submit.
submit_button
(строка) HTML-шаблон кнопки отправки комментария, по умолчанию <input name="%1$s" type="submit" id="%2$s" class="%3$s" value="%4$s" />.
submit_field
(строка) HTML-шаблон тега-контейнера для кнопки отправки комментария, по умолчанию <p class="form-submit">%1$s %2$s</p>.
type
(строка) Установив значение данного параметра html5, мы разрешим использовать разметку HTML5 в форме комментирования.
$post_id
(целое число) ID поста, для которого будем выводить форму комментирования, по умолчанию — текущий пост.

Несмотря на то, что функция имеет довольно большое количество параметров, её можно использовать и без них, например достаточно написать comment_form(), чтобы у вас вывелась рабочая форма комментариев на сайте. Однако, иногда бывает, что при помощи этой функции невозможно сделать форму комментов 1 в 1, как на заданном дизайне или вёрстке, тогда приходится использовать альтернативное решение.

А теперь попробуем изменить форму комментариев при помощи хуков.

comment_form_default_fields

Изменяем подписи полей формы

Данный фильтр позволяет нам изменить HTML любого из полей формы (кроме поля комментария), для изменения полей формы мы либо можем полностью передать новый HTML полей, либо воспользоваться функцией str_replace(). Давайте попробуем оба способа!

add_filter( 'comment_form_default_fields', 'truemisha_change_labels', 25 );
 
function truemisha_change_labels( $fields ){
 
	// можно подсмотреть исходный HTML через:
	//print_r( $fields );
 
	// 1. полностью перезадаём HTML поля
	$fields[ 'email'] = '<p class="comment-form-email"><label for="email">Электронная почта <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" required="required"></p>';
 
	// 2. воспользуемся функция str_replace()
	$fields[ 'author' ] = str_replace( 'Имя', 'Как вас зовут?', $fields[ 'author' ] );
 
	// не забываем возвратить отфильтрованный (изменённый) результат
	return $fields;
 
}

Не знаете, куда вставлять код?

Результат на стандартной теме Twenty Twenty One:

изменяем текст полей формы комментирования WordPress

Удаляем поле «Сайт»

Тут всё очень легко:

add_filter( 'comment_form_default_fields', 'truemisha_remove_url_field', 25 );
 
function truemisha_remove_url_field( $fields ) {
	unset( $fields[ 'url' ] );
	return $fields;
}

Не знаете, куда вставлять код?

Меняем поля местами

При помощи этого же хука comment_form_default_fields мы можем также и переставить поля местами, единственный большой минус в том, что мы не можем при помоши этого хука изменить положение поля ввода комментария, но можем например поменять местами поля «Имя» и «Email». Чтобы поменять положения поля ввода комментария вам понадобится воспользоваться этим примером.

Как нетрудно догадаться, тут всё сводится к сортировке массивов в PHP.

Но я вам вообще покажу, как это сделать через foreach().

add_action( 'comment_form_default_fields', 'truemisha_change_fields_order', 25 );
 
function truemisha_change_fields_order( $fields ) {
 
	// правила сортировки
	$order = array( 'email', 'author', 'url', 'cookies' ); // меняем Имя и Email
 
	// новый массив с изменённым порядком
	$new_fields = array();
 
	foreach( $order as $index ) {
		$new_fields[ $index ] = $fields[ $index ];
	}
 
	return $new_fields;
 
}

Не знаете, куда вставлять код?

Меняем поля формы комментирования WordPress местами

Как добавить произвольное поле в форму комментирования WordPress?

Код ниже состоит из трёх этапов:

  1. Сначала мы добавляем поле при помощи уже знакомого хука comment_form_defaults.
  2. Можем провалидировать значение нашего нового поля любым способом, т.е. можем просто проверить, что поле не пустое, можем проверить, чтобы оно было определённой длины или через регулярные выражения. А можем вообще скипнуть второй шаг.
  3. Сохраняем значение поля в метаданные комментария при помощи add_comment_meta().
  4. Не забываем про очистку пользовательского ввода.
// 1. добавляем поле
add_filter( 'comment_form_defaults', 'truemisha_add_comment_field');
function truemisha_add_comment_field( $default ) {
 
	$default[ 'fields' ][ 'city' ] = '<p class="comment-form-city"><label for="city">Город <span class="required">*</span></label><input id="city" name="city" size="30" type="text" /></p>';
	return $default;
 
}
 
// 2. валидация поля (если нужно)
add_filter( 'pre_comment_on_post', 'truemisha_verify_comment' );
function truemisha_verify_comment( $commentdata ) {
 
	if ( empty( $_POST[ 'city' ] ) ) {
		wp_die( 'Укажите свой город!' );
	}
	return $commentdata;
 
}
 
// 3. сохраняем значение поля город в метаданные комментария
add_action( 'comment_post', 'truemisha_save_comment_field_data' );
function truemisha_save_comment_field_data( $comment_id ) {
 
	add_comment_meta( $comment_id, 'city', sanitize_text_field( $_POST[ 'city' ] ) );
 
}

Не знаете, куда вставлять код?

Добавляем новое поле в форму комментариев WordPress

comment_form_field_{ID поля}

Фильтр, который применяется к каждому полю ввода уже после задействования фильтра comment_form_default_fields.

Используя этот фильтр мы можем так же изменить HTML любого из полей формы, и даже поля формы комментирования фильтром comment_form_field_comment (в коде кстати это отдельный фильтр, но в данный момент это не имеет для нас значения)!

Изменяем лейбл поля ввода комментария

При помощи хука comment_form_default_fields мы меняли подписи к полям чуть выше, однако тот фильтр-хук не давал нам возможности поменять лейбл к полю ввода комментария, так давайте поменяем его сейчас.

add_filter( 'comment_form_field_comment', 'truemisha_change_comment_label', 25 );
 
function truemisha_change_comment_label( $field ) {
 
	$field = str_replace( 'Комментарий', 'Что думаете об этой новости?', $field );
	return $field;
 
}

Не знаете, куда вставлять код?

Результат:

изменяем лейбл к полю ввода комментария

Напоминаю также про мой видеоурок про то, как реализовать комментарии при создании темы WordPress с нуля 😁

comment_form_defaults

При помощи этого фильтр-хука вы можете отфильтровать любой из параметров, передающихся в функцию.

Как изменить текст кнопки на «Оставить отзыв»?

add_filter( 'comment_form_defaults', 'truemisha_comment_button_text', 25 );
 
function truemisha_comment_button_text( $args ) {
 
	$args[ 'label_submit' ] = 'Оставить отзыв';
	return $args;
 
}

Не знаете, куда вставлять код?

Как изменить текст кнопки с Оставить комментарий на Оставить отзыв

Другие хуки

В этом разделе я бы хотел познакомить вас с экшен-хуками, которые в основном позволяют вывести какой-то текст или HTML-код в определённой части формы комментария.

comment_form_comments_closed

Этот экшн-хук позволяет вывести текст или HTML код вместо формы комментариев, когда комментарии к этой конкретной записи закрыты.

Например:

add_action( 'comment_form_comments_closed', 'truemisha_closed_comments_text', 25 );
 
function truemisha_closed_comments_text() {
	echo '<p><a href="#">Напишите нам</a>, если нужна личная консультация по уроку!</p>';
}

Не знаете, куда вставлять код?

comment_form_before

При помощи этого хука вы можете вывести что-либо в самом начале форме комментария, перед тегом <div id="respond">.

Никаких параметров в хук не передаётся.

comment_form_must_log_in_after

Экшн-хук comment_form_must_log_in_after позволяет вам вывести текст или HTML-тег после сообщения о необходимости регистрации, в случае, если комментарии могут оставлять только зарегистрированные пользователи (Настойки > Обсуждение) и если пользователь не авторизован (проверяется функцией is_user_logged_in()).

У хука нет параметров.

comment_form_top

Экшн-хук без параметров, срабатывает сразу после открывающего тега <form>.

add_action( 'comment_form_top', 'truemisha_after_form_tag', 25 );
 
function truemisha_after_form_tag() {
	echo 'текст сразу после тега form';
}

comment_form_logged_in

Позволяет отфильтровать параметр функции logged_in_as, отличие от хука comment_form_defaults в том, что этот фильтр более приоритетный и позволяет отфильтровать не только стандартное значение параметра, но и то значение, которое было передано непосредственно в функцию.

add_filter( 'comment_form_logged_in', 'truemisha_logged_in_as_text', 25, 3 );
 
function truemisha_logged_in_as_text( $logged_in_as, $commenter, $user_identity ) {
 
	// $logged_in_as – текст/HTML по умолчанию
	// $commenter – куки комментатора, если включены (имя, емейл, сайт)
	// $user_identity – отображаемое имя пользователя
 
	return sprintf( 'Привет, %s! Как насчёт комментария?', $user_identity );
 
}

Не знаете, куда вставлять код?

изменяем текст для авторизованного пользователя

comment_form_logged_in_after

Экшн-хук, позволяющий вывести текст или HTML-код непосредственно после сообщения в параметре logged_in_as (смотрите предыдущий хук).

Экшн-хук принимает практически такие же параметры, как и comment_form_logged_in, а именно $commenter, $user_identity.

comment_form_fields (меняем порядок поля ввода комментария)

Финишный хук, подготавливающий массив полей для формы комментария.

Помните, я говорил вам, что у вас не получится изменить порядок некоторых полей (поля формы комментария) хуком comment_form_default_fields, так вот, фильтр-хук comment_form_fields позволит вам это сделать. Появился он относительно недавно, в версии WordPress 4.4.0.

Например мы можем воспользоваться этим кодом:

add_action( 'comment_form_fields', 'truemisha_change_all_fields_order', 25 );
 
function truemisha_change_all_fields_order( $comment_fields ) {
 
 	// print_r( $comment_fields );
	// правила сортировки
	$order = array( 'author', 'email', 'comment' );
 
	// новый массив с изменённым порядком
	$new_fields = array();
 
	foreach( $order as $index ) {
		$new_fields[ $index ] = $comment_fields[ $index ];
	}
 
	return $new_fields;
 
}

Не знаете, куда вставлять код?

Как изменить порядок любых полей в форме комментария

comment_form_submit_button

Этот фильтр-хук позволяет полностью изменить HTML кнопки отправки комментария.

Например:

add_filter( 'comment_form_submit_button', 'truemisha_comment_button', 25, 2 );
 
function truemisha_comment_button( $submit_button, $args ) {
	// $submit_button – исходный HTML кнопки
	// $args[ 'name_submit' ] – атрибут name кнопки
	// $args[ 'id_submit' ] – атрибут id кнопки
	// $args[ 'class_submit' ] – CSS-класс(ы)
	// $args[ 'label_submit' ] – текст кнопки
 
	// тут мы можем сгенерировать новый HTML кнопки и вернуть его
	return $submit_button;
 
}

comment_form

Экшн-хук, выполняющийся в самом конце формы отправки комментария, перед закрывающимся тегом </form>.

Принимает только параметр $post_id с ID поста, к которому оставляется комментарий.

add_action( 'comment_form', 'truemisha_text_after_comment_form', 25 );
 
function truemisha_text_after_comment_form( $post_id ) {
	echo 'Вы оставляете коммент к посту с ID : ' . $post_id;
}

comment_form_after

Экшн-хук в самом конце формы, после закрывающихся тегов </form> и </div> (который <div id="respond">).

Не принимает никаких параметров.

Также хочу ещё раз порекомендовать вам свой видеокурс по созданию темы WordPress на основе готовой вёрстки, вот ссылка.

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Комментарии — 42

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал