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);

Комментарии 37

  • Дмитрий7 октября 2014 в 19:10 #

    Функции из примеров про поле с телефоном не работают.
    Нужно еще что-то где-то дописывать?

  • Теодор23 марта 2015 в 18:03 #

    Здравствуйте! Я выставил в настройках "оставлять комментарии могут только зарегистрированные и авторизованные пользователи" и прикрутил авторизацию через соц. сети. Я хочу, чтобы неавторизовнный пользователь видел не только текст с предложением авторизоваться и кнопки соц.сетей, но и само поле для ввода комментария. Но при этом, чтобы кнопка отправки коммента срабатывала только после авторизации. Мой сайт - http://teen-spirit.ru/rock-news/slash-wont-look-at-crowd/.

    • Миша24 марта 2015 в 13:03 #

      Здравствуйте!
      Ну что я могу сказать, тут нужно писать код. Можете использовать проверку, авторизован ли пользователь:

      global $user_ID;
      if( $user_ID ) {
       
      }
  • Павел2 апреля 2015 в 19:04 #

    А куда именно вставлять нужно в начале, посередине или в конце functions.php

  • Павел2 апреля 2015 в 20:04 #

    А как можно изменить заголовок формы, по умолчанию «Добавить комментарий».

    • Миша3 апреля 2015 в 07:04 #

      Функция comment_form_title() не принимает ни такого параметра ни фильтра. Похоже, что нельзя.

  • Алексей4 мая 2015 в 08:05 #

    подскажите как можно форму комментария сделать выше формы ввода имени и мейла?
    можно ли удалять форму сайт вырезав из кода

    'url' => '<p class="comment-form-url"><label for="url">Сайт</label> <input id="url" name="url" type="text" value="" size="30" /></p>'

    будет ли это правильным Возник такой вопрос так как вы предлагаете удаление функцией?

    • Миша4 мая 2015 в 13:05 #

      Ну это конечно не ответ, но сделайте вывод формы комментария не через comment_form() — тут считай сможете уже настроить себе так, как захотите.

  • Алексей4 мая 2015 в 14:05 #

    я так и делаю

      <?php
        $fields = array(
          'author' => '<p class="comment-form-author"><input type="text" id="author" name="author" class="author" value="' . esc_attr($commenter['comment_author']) . '" placeholder="Ваше Имя" pattern="[A-Za-zА-Яа-я]{3,}" maxlength="30" autocomplete="on" tabindex="1" required' . $aria_req . '></p>',
          'email' => '<p class="comment-form-email"><input type="email" id="email" name="email" class="email" value="' . esc_attr($commenter['comment_author_email']) . '" placeholder="Ваш E-mail" maxlength="30" autocomplete="on" tabindex="2" required' . $aria_req . '></p>',
     
        );
     
        $args = array(
          'comment_notes_after' => '',
          'comment_field' => '<p class="comment-form-comment"><textarea id="comment" name="comment" class="comment-form" cols="45" rows="8" aria-required="true" placeholder="Ваш комментарий"></textarea></p>',
          'label_submit' => 'Отправить',
          'fields' => apply_filters('comment_form_default_fields', $fields)
        );
        comment_form($args);
      ?>

    меняю строчки местами то совсем всё пропадает то отображается только форма комментария а поля для мейла и имени нет

    • Миша4 мая 2015 в 21:05 #

      Я имею ввиду в чистом HTML.

      • Алексей5 мая 2015 в 16:05 #

        спасибо! написал А не подскажите как можно сделать чтобы при клике на "ответить на комментарий" Форма ввода поднималась под этот комментарий?

        • Миша6 мая 2015 в 14:05 #

          К сожалению сходу не могу ответить на ваш вопрос. Но если он для вас очень важен, можем решить проблему по email.

        • VRS4 июня 2015 в 01:06 #

          Тут в комментариях обработчик для формы

          http://wordpress.stackexchange.com/questions/139324/how-to-unset-comment-notes-before-field-in-wordpress-comment-form

          если еще актуально.

          Надеюсь, Миша не будет против).

          Чтобы форма поднималась к комментарию, погуглите про

           if (is_singular() AND comments_open() AND (get_option('thread_comments') == 1)) wp_enqueue_script('comment-reply');

          Но тогда, правда, не появляется надпись "Написать ответ для ...."

  • Максим28 августа 2015 в 22:08 #

    А как в этой функции вывести что то свое после закрывающего тега ?

    • Миша31 августа 2015 в 14:08 #

      Да можете просто в параметре comment_notes_after что-то указать своё, если я правильно понял вопрос.

      P.S. сорри за нескорый ответ — был в отъезде.

  • Dennis.k13 октября 2015 в 13:10 #

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

    • Миша13 октября 2015 в 14:10 #

      Здравствуйте!
      Если хотите сделать форму отзыва, лучше просто через HTML её. comment_form() на мой взгляд для этого не подходит.

  • Владимир15 октября 2015 в 15:10 #

    Про поле ввода телефона. Форма появляется, всё Ок. Вот только не понятно куда девается номер телефона :) Как его получить в письме с комментарием которое присылает WP? И в админке?

    • Миша16 октября 2015 в 20:10 #

      Попробуйте получить её в фильтре pre_comment_on_post.

      • Владимир19 октября 2015 в 14:10 #

        Программист из меня никакой :) Довольно долго пытался найти/гуглить решение, как применить pre_comment_on_post получилось опубликовать телефон прямо в комментарии... А нужно не совсем это, нужно чтобы тел. был не "опубликован в комментарии" а скрыт от посторонних глаз и "отображался в письме которое приходит администратору".
        То есть вместо этого:

        Новый комментарий к записи "Post with Image"
        Автор: Владимир (IP: 000.000.000.0, nnnnn.nnn.net)
        E-mail: nnn@nnn.nn
        URL:
        Комментарий:nnn

        В письме было вот это:

        Новый комментарий к записи "Post with Image"
        Автор: Николай (IP: 000.000.000.0, nnnnn.nnn.net)
        E-mail: nnn@nnn.nn
        Телефон: +79180000000
        URL:
        Комментарий: nnn

        Если это не очень сложно, не могли бы вы написать готовое решение? Мне кажется эта информация будет полезна многим пользователям. Или подскажите куда копать... найти простое решение в поисковиках не удалось.

  • Рустам12 ноября 2015 в 15:11 #

    Здравствуйте, подскажите как можно немного подправить форму комментариев, установил плагин Comment Images - для загрузки фото в комментарии, но кнопку загрузки необходимо вынести в другое место, например над формой textarea. Вот страница где установлена форма - http://sto-lublino.ru/otzivi.php#comments . Подскажите пожалуйста что нужно подправить добавить

  • Миша13 ноября 2015 в 11:11 #

    Здравствуйте! Плагин автоматически добавляет кнопку в форму?

    • Рустам13 ноября 2015 в 18:11 #

      да, именно, никаких настроек у плагина нет, в файлах плагина ничего не нашел, или ума не хватило что бы найти :) помогите пожалуйста :)

  • Роман22 декабря 2015 в 09:12 #

    Есть ли способ "вынести" кнопку «Отменить ответ» из формы, чтобы нажав на кнопку «Ответ» на её месте появлялась кнопка «Отменить ответ»?

    • Миша23 декабря 2015 в 02:12 #

      Способ то есть, только сами понимаете, многое в JS коде придётся поменять.

  • Дмитрий21 сентября 2016 в 21:09 #

    А как в таком случае сделать поле с телефоном обязательным?

  • Дмитрий21 сентября 2016 в 21:09 #

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

    • Миша22 сентября 2016 в 17:09 #

      При помощи is_user_logged_in()

      • Дмитрий22 сентября 2016 в 21:09 #

        Спасибо. Разобрался.

      • Дмитрий23 сентября 2016 в 11:09 #

        В итоге запутался. Выяснил, что надо идти через

        comment_form_logged_in_after

        . Но вывести свое кастомное пока не могу.

        • Миша23 сентября 2016 в 13:09 #

          Попробуйте этот код. Сам не тестил, но думаю должно работать.

          // два хука
          add_action( 'comment_form_logged_in_after', 'misha_one_more_field' );
          add_action( 'comment_form_after_fields', 'misha_one_more_field' );
           
          // и функция
          function misha_one_more_field() {
          echo '<p class="comment-form-title">
                  <label for="pmg_comment_title">Какой-нибудь лейбл</label>
                  <input type="text" name="" id="" />
              </p>';
          }

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.

  • Артем: Ага, понял. Вот только почему $args? Она же нигде не определена, по логике должна быть переменная $true_field_params или...