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

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

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

comment_form( $args = array(), $post_id = null )
$args
(массив) Параметры полей формы. В качестве примеров по умолчанию я сразу буду приводить строки с русской локализацией, для удобства.

fields
(массив) Ассоциативный массив, состоящий из ID полей (сюда не относится поле ввода комментария) и их кода HTML, по умолчанию (с применением локализации и интерпретацией PHP):

$args = array(
	'fields' => array(
		'author' => '<p class="comment-form-author"><label for="author">Имя</label> <input id="author" name="author" type="text" value="" size="30" /></p>',
		'email' => '<p class="comment-form-email"><label for="email">E-mail</label> <input id="email" name="email" type="text" value="" size="30" /></p>',
		'url' => '<p class="comment-form-url"><label for="url">Сайт</label> <input id="url" name="url" type="text" value="" size="30" /></p>'
	)
 
);

То есть какие поля будут переданы через fields, те и будут в итоге выведены в форме. Параметр не позволяет по отдельности менять HTML полей, то есть либо вы меняете сразу все поля, либо не меняете вообще.

Обратите внимание, если вы таким образом измените HTML полей формы «Имя» или «Email», то, при повторной отправке комментария пользователем его данные сохраняться не будут.

comment_field
(строка) Поле комментария и его лейбл, по умолчанию:

<p class="comment-form-comment"><label for="comment">Комментарий</label> <textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p>
must_log_in
(строка) Текст, который будет отображаться в качестве сообщения об ошибке пользователю, если он не залогинен, а оставлять комментарии могут только залогиненные пользователи (настройка устанавливается в админке в Настройки > Обсуждение). По умолчанию:

<p class="must-log-in">Для отправки комментария вы должны <a href="{тут ссылка на страницу авторизации}">авторизоваться</a>.</p>
logged_in_as
(строка) Текст с HTML-кодом, который будет отображаться для авторизованных пользоваетелй, например по умолчанию он будет такой:

<p class="logged-in-as">Вы вошли как <a href="{ссылка на профиль}">{отображаемое имя}</a>. <a href="{ссылка выхода}" title="Выйти из этой учётной записи">Выйти?</a></p>
comment_notes_before
(строка) Текст или HTML-код, который будет добавляться перед полями ввода для неавторизованных пользователей:

<p class="comment-notes">Ваш e-mail не будет опубликован.</p>
comment_notes_after
(строка) Текст или HTML-код, который будет добавляться после всех полей ввода (в том числе после поля комментария) и перед кнопкой отправки. По умолчанию это список тегов, разрешенных к использованию в тексте комментария:

<p class="form-allowed-tags">Можно использовать следующие <abbr title="HyperText Markup Language">HTML</abbr>-теги и атрибуты:  <code>&lt;a href=&quot;&quot; title=&quot;&quot;&gt; &lt;abbr title=&quot;&quot;&gt; &lt;acronym title=&quot;&quot;&gt; &lt;b&gt; &lt;blockquote cite=&quot;&quot;&gt; &lt;cite&gt; &lt;code&gt; &lt;del datetime=&quot;&quot;&gt; &lt;em&gt; &lt;i&gt; &lt;q cite=&quot;&quot;&gt; &lt;strike&gt; &lt;strong&gt; </code></p>
id_form
(строка) Атрибут id тега <form>. По умолчанию commentform.
id_submit
(строка) Атрибут id кнопки отправки формы. По умолчанию submit.
title_reply
(строка) Заголовок формы, по умолчанию «Добавить комментарий».
title_reply_to
(строка) Заголовок формы при ответе на другой комментарий.
cancel_reply_link
(строка) Текст ссылки отмены ответа, по умолчанию «Отменить ответ».
label_submit
(строка) Текст кнопки отправки комментария, по умолчанию «Оставить комментарий».
type
(строка) Установив значение данного параметра html5, мы разрешим использовать разметку HTML5 в форме комментирования.
$post_id
(целое число) ID поста, для которого будем выводить форму комментирования, по умолчанию — текущий пост.

Пример

$args = array(
	// изменяем текст кнопки отправки 
	'label_submit'=>'Запостить коммент',
	// удаляем сообщение со списком разрешенных HTML-тегов из-под формы комментирования
	'comment_notes_after' => '',
	// указываем собственный HTML-код для вывода поля комментария
	'comment_field' => '<p class="comment-form-comment"><label for="comment">Твой коммент</label><br /><textarea id="comment" name="comment" aria-required="true"></textarea></p>',
);
comment_form( $args );

Фильтр comment_form_default_fields

Обратите внимание, используя параметр fields, мы не можем изменить какое-либо конкретное поля комментирования или добавить новое, не затрагивая при этом остальные поля ввода.

Фильтр применяется уже в конце, то есть после того, как вступят в силу значения элементов массива fields.

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

Хорошо, такой пример — допустим, нам нужно добавить поле ввода телефона. Как это сделать? Вставив этот код в functions.php:

function true_phone_number_field( $fields ) {
	$fields['phone'] = '<p class="comment-form-phone"><label for="phone">Телефон</label> <input id="phone" name="phone" type="text" value="" size="30" /></p>';
	return $fields;
}
 
add_filter( 'comment_form_default_fields', 'true_phone_number_field', 10, 1);

А можно ли сделать так, чтобы поле для ввода телефона располагалось сразу под полем «E-mail»? Да, вот так:

function true_phone_number_field($fields) {
	$phone = array('phone' => '<p class="comment-form-phone"><label for="phone">Телефон</label> <input id="phone" name="phone" type="text" value="" size="30" /></p>' );
	$fields = array_slice( $fields, 0, 2, true ) + $phone + array_slice( $fields, 2, NULL, true );
	return $fields;
}
 
add_filter( 'comment_form_default_fields', 'true_phone_number_field', 10, 1);

И давайте рассмотрим ещё один пример, в котором мы удалим поле «Сайт»:

function true_remove_url_field( $fields ) {
	unset( $fields['url'] );
	return $fields;
}
 
add_filter( 'comment_form_default_fields', 'true_remove_url_field', 10, 1);

Фильтр comment_form_field_{ID поля}

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

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

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

Так, ну давайте в качестве примера вместо поля «Сайт» напишем «http://», для этого в functions.php добавляем следующий код:

function true_change_url_label( $field ) {
	return '<p class="comment-form-url"><label for="url">http://</label> <input id="url" name="url" type="text" value="" size="30" /></p>';
}
 
add_filter( 'comment_form_field_url', 'true_change_url_label', 10, 1);
Миша Рудрастых Разработчик WordPress WooCommerce

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

Впервые познакомился с WordPress в 2009 году, и после двух лет мучений с Joomla и самописными движками это был просто бальзам на душу. С 2014 года меня можно встретить на WordCamp — официальной конфе по WP в Москве, иногда там выступаю. Также в настоящее время веду курсы по WordPress в Epic Skills в Питере.