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

Использование этой функции не обязательно при создании системы комментирования на вашем сайте, о том, как это сделать без функции 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><a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> </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);

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

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

Комментирование этого поста более не доступно.
  • Дмитрий 7 октября 2014 #

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

    • Миша 8 октября 2014 #

      А вы какой пример с телефоном пробуете — первый или второй?

  • Теодор 23 марта 2015 #

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

    • Миша 24 марта 2015 #

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

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

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

    • Миша 3 апреля 2015 #

      В любое место, главное не вовнутрь других функций 🙂

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

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

    • Миша 3 апреля 2015 #

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

  • Алексей 4 мая 2015 #

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

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

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

    • Миша 4 мая 2015 #

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

  • Алексей 4 мая 2015 #

    я так и делаю

      <?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 #

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

      • Алексей 5 мая 2015 #

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

        • Миша 6 мая 2015 #

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

        • VRS 4 июня 2015 #

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

          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 #

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

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

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

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

  • Dennis.k 13 октября 2015 #

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

    • Миша 13 октября 2015 #

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

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

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

    • Миша 16 октября 2015 #

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

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

        Программист из меня никакой 🙂 Довольно долго пытался найти/гуглить решение, как применить 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 #

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

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

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

    • Рустам 13 ноября 2015 #

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

      • Миша 14 ноября 2015 #

        Самый простой вариант - сдвинуть кнопку в форме при помощи JavaScript/jQuery 🙂

  • Роман 22 декабря 2015 #

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

    • Миша 23 декабря 2015 #

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

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

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

    • Миша 22 сентября 2016 #

      Атрибут required

      • Дмитрий 22 сентября 2016 #

        Почему-то добавление записи required' . $aria_req . ' не помогло. Не помогла так же запись aria-required="true" required="required"

        • Миша 23 сентября 2016 #

          По идее required="required" или просто required должно работать без проблем.

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

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

    • Миша 22 сентября 2016 #

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

      • Дмитрий 22 сентября 2016 #

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

      • Дмитрий 23 сентября 2016 #

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

        comment_form_logged_in_after

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

        • Миша 23 сентября 2016 #

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

          // два хука
          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>';
          }
  • Алексей 18 февраля 2017 #

    Миша, здравствуйте!
    Подскажите, пожалуйста, что нужно, чтобы сделать комментарии на страницах рубрик.
    Я когда то давно для одного сайта хотел сделать, мне программист сказал, что в архивах комменты в принципе невозможны и я отступился.
    Но сейчас знаю сайты, где они сделаны, значит можно.
    Но как?
    просто вставить код в category.php вроде не работает...

    • Миша 18 февраля 2017 #

      Здравствуйте!

      Сам WordPress это не поддерживает, но можно пойти хитрым путём. Первое, что пришло мне в голову, это:

      1. Создать страницу, используя шаблоны страниц.
      2. Добавить туда цикл категории.
      3. Подключить комменты к этой странице.
  • Алексей 18 февраля 2017 #

    так надо комментарии в рубриках, а не на страницах
    в category.php а не в page.php

    • Миша 19 февраля 2017 #

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

  • Dan Zakirov 7 декабря 2019 #

    как получить comment_form а не выводить?

  • Борис 29 февраля 2020 #

    Мой комментарий