Функция выводит полноценную форму для комментирования, которую можно использовать в теме сайта.
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 поля автора комментария.
- (строка) 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 поста, для которого будем выводить форму комментирования, по умолчанию — текущий пост.
- fields
- (массив) Содержит HTML стандартных полей формы (кроме поля комментария), можно передать свой произвольный HTML для каждого (какого-либо) поля, удалить одно из стандартных полей или добавить новое. Кроме того, если у вас нет возможности передать этот параметр в функцию, то можете отфильтровать его через comment_form_default_fields.
- author
- (строка) HTML поля автора комментария.
- (строка) 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 в форме комментирования.
- author
- (строка) HTML поля автора комментария.
- (строка) HTML поля электронной почты.
- url
- (строка) HTML поля «Сайт».
- cookies
- (строка) HTML чекбокса согласия с принятием куков автора комментария (включается в Настройки > Обсуждение)
А теперь попробуем изменить форму комментариев при помощи хуков.
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:
Удаляем поле «Сайт»
Тут всё очень легко:
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?
Код ниже состоит из трёх этапов:
// 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' ] ) ); }
Не знаете, куда вставлять код?
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; }
Не знаете, куда вставлять код?
Результат:
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">
).
Не принимает никаких параметров.