Посмотрите мой видеоурок про то, как реализовать комментарии при создании темы WordPress с нуля.
Функция выводит полноценную форму для комментирования, которую можно использовать в теме сайта.
HTML полей и лейблы можно задать при помощи параметра $args
функции, если же вам понадобится удалить одно из стандартных полей или добавить новое, воспользуйтесь фильтром comment_form_default_fields. Кроме того, каждое из полей проходит отдельно через фильтр comment_form_field_$name, где $name
— это ID поля, задающийся в параметрах в массиве fields
.
comment_form( $args = array(), $post_id = null )
action
формы, по умолчанию site_url( '/wp-comments-post.php' )
.<form>
. По умолчанию commentform
.comment-form
.comment-respond
<h3 id="reply-title" class="comment-reply-title">
.</h3>
.<small>
</small>
submit
.submit
.submit
.<input name="%1$s" type="submit" id="%2$s" class="%3$s" value="%4$s" />
.<p class="form-submit">%1$s %2$s</p>
.html5
, мы разрешим использовать разметку HTML5 в форме комментирования.Несмотря на то, что функция имеет довольно большое количество параметров, её можно использовать и без них, например достаточно написать comment_form()
, чтобы у вас вывелась рабочая форма комментариев на сайте. Однако, иногда бывает, что при помощи этой функции невозможно сделать форму комментов 1 в 1, как на заданном дизайне или вёрстке, тогда приходится использовать альтернативное решение.
А теперь попробуем изменить форму комментариев при помощи хуков.
Данный фильтр позволяет нам изменить 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; }
Не знаете, куда вставлять код?
Код ниже состоит из трёх этапов:
comment_form_defaults
.// 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_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 с нуля 😁
При помощи этого фильтр-хука вы можете отфильтровать любой из параметров, передающихся в функцию.
add_filter( 'comment_form_defaults', 'truemisha_comment_button_text', 25 ); function truemisha_comment_button_text( $args ) { $args[ 'label_submit' ] = 'Оставить отзыв'; return $args; }
Не знаете, куда вставлять код?
В этом разделе я бы хотел познакомить вас с экшен-хуками, которые в основном позволяют вывести какой-то текст или HTML-код в определённой части формы комментария.
Этот экшн-хук позволяет вывести текст или HTML код вместо формы комментариев, когда комментарии к этой конкретной записи закрыты.
Например:
add_action( 'comment_form_comments_closed', 'truemisha_closed_comments_text', 25 ); function truemisha_closed_comments_text() { echo '<p><a href="#">Напишите нам</a>, если нужна личная консультация по уроку!</p>'; }
Не знаете, куда вставлять код?
При помощи этого хука вы можете вывести что-либо в самом начале форме комментария, перед тегом <div id="respond">
.
Никаких параметров в хук не передаётся.
Экшн-хук comment_form_must_log_in_after
позволяет вам вывести текст или HTML-тег после сообщения о необходимости регистрации, в случае, если комментарии могут оставлять только зарегистрированные пользователи (Настойки > Обсуждение) и если пользователь не авторизован (проверяется функцией is_user_logged_in()).
У хука нет параметров.
Экшн-хук без параметров, срабатывает сразу после открывающего тега <form>
.
add_action( 'comment_form_top', 'truemisha_after_form_tag', 25 ); function truemisha_after_form_tag() { echo 'текст сразу после тега form'; }
Позволяет отфильтровать параметр функции 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 ); }
Не знаете, куда вставлять код?
Экшн-хук, позволяющий вывести текст или HTML-код непосредственно после сообщения в параметре logged_in_as
(смотрите предыдущий хук).
Экшн-хук принимает практически такие же параметры, как и comment_form_logged_in, а именно $commenter
, $user_identity
.
Финишный хук, подготавливающий массив полей для формы комментария.
Помните, я говорил вам, что у вас не получится изменить порядок некоторых полей (поля формы комментария) хуком 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; }
Не знаете, куда вставлять код?
Этот фильтр-хук позволяет полностью изменить 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; }
Экшн-хук, выполняющийся в самом конце формы отправки комментария, перед закрывающимся тегом </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; }
Экшн-хук в самом конце формы, после закрывающихся тегов </form>
и </div>
(который <div id="respond">
).
Не принимает никаких параметров.
Также хочу ещё раз порекомендовать вам свой видеокурс по созданию темы WordPress на основе готовой вёрстки, вот ссылка.
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Функции из примеров про поле с телефоном не работают.
Нужно еще что-то где-то дописывать?
А куда именно вставлять нужно в начале, посередине или в конце functions.php
В любое место, главное не вовнутрь других функций :)
А как можно изменить заголовок формы, по умолчанию «Добавить комментарий».
Можете передать в функцию параметр
title_reply
, либо через хукtitle_reply
.подскажите как можно форму комментария сделать выше формы ввода имени и мейла?
можно ли удалять форму сайт вырезав из кода
будет ли это правильным Возник такой вопрос так как вы предлагаете удаление функцией?
Рекомендую попробовать этот пример.
я так и делаю
меняю строчки местами то совсем всё пропадает то отображается только форма комментария а поля для мейла и имени нет
Ещё кстати можете попробовать написать форму на чистом HTML.
спасибо! написал А не подскажите как можно сделать чтобы при клике на "ответить на комментарий" Форма ввода поднималась под этот комментарий?
По идее она так и должна работать, если у вас правильно подключен скрипт comment-reply.js
Тут в комментариях обработчик для формы
если еще актуально.
Надеюсь, Миша не будет против).
Чтобы форма поднималась к комментарию, погуглите про
Но тогда, правда, не появляется надпись "Написать ответ для ...."
А как в этой функции вывести что то свое после закрывающего тега ?
Да можете просто в параметре
comment_notes_after
что-то указать своё, если я правильно понял вопрос.P.S. сорри за нескорый ответ — был в отъезде.
здравствуйте, спасибо за статью, только ни как не могу понять, каким образом нужно выводить новые поля в отзывах? при отправки отзывов с новыми полями, автор и комментарий выводится, а вот информация новых полей - нет, подскажите где искать проблему? смотрел в базе данных, информации с новых полей тоже нет.
Здравствуйте!
Если вы смогли добавить новые поля и сохранить их в базу данных, то для их получения можете воспользоваться функцией
get_comment_meta()
.Если вы говорите, что и в базе данных их нет, то рекомендую рассмотреть внимательнее этот пример.
Про поле ввода телефона. Форма появляется, всё Ок. Вот только не понятно куда девается номер телефона :) Как его получить в письме с комментарием которое присылает WP? И в админке?
Обновил пример с номером телефона (только это поле города теперь), сейчас должно быть всё понятно :)
Программист из меня никакой :) Довольно долго пытался найти/гуглить решение, как применить pre_comment_on_post получилось опубликовать телефон прямо в комментарии... А нужно не совсем это, нужно чтобы тел. был не "опубликован в комментарии" а скрыт от посторонних глаз и "отображался в письме которое приходит администратору".
То есть вместо этого:
В письме было вот это:
Если это не очень сложно, не могли бы вы написать готовое решение? Мне кажется эта информация будет полезна многим пользователям. Или подскажите куда копать... найти простое решение в поисковиках не удалось.
Есть ли способ "вынести" кнопку «Отменить ответ» из формы, чтобы нажав на кнопку «Ответ» на её месте появлялась кнопка «Отменить ответ»?
Способ то есть, только сами понимаете, многое в JS коде придётся поменять.
А как в таком случае сделать поле с телефоном обязательным?
Атрибут required
Почему-то добавление записи required' . $aria_req . ' не помогло. Не помогла так же запись aria-required="true" required="required"
По идее required="required" или просто required должно работать без проблем.
Плюс в примере я добавил ещё код, как сделать валидацию на PHP. Надеюсь, поможет.
И второй вопрос. После входа зарегистрированного пользователя на сайт в форме для ввода комментариев исчезают поля, которые были для заполнения для не авторизованного пользователя (там только поле для комментария). Подскажите пожалуйста, как вывести в эту форму (для авторизованных пользователей) кастомное обязательное поле?
При помощи is_user_logged_in()
Спасибо. Разобрался.
В итоге запутался. Выяснил, что надо идти через
. Но вывести свое кастомное пока не могу.
Попробуйте этот код. Сам не тестил, но думаю должно работать.
Миша, здравствуйте!
Подскажите, пожалуйста, что нужно, чтобы сделать комментарии на страницах рубрик.
Я когда то давно для одного сайта хотел сделать, мне программист сказал, что в архивах комменты в принципе невозможны и я отступился.
Но сейчас знаю сайты, где они сделаны, значит можно.
Но как?
просто вставить код в category.php вроде не работает...
Здравствуйте!
Сам WordPress это не поддерживает, но можно пойти хитрым путём. Первое, что пришло мне в голову, это:
как получить comment_form а не выводить?
Мой комментарий
Не совсем в тему вопрос, читал как убрать поле "email" в форме комментариев вордпресс и чтобы wp потом не требовал ввести email, после фильтра, нужно в настройках WordPress («Настройки» > «Обсуждение») убрать галочку с пункта «Автор комментария должен указать имя и e-mail». Но вся проблема в том, что у меня нет поля "Обсуждение" в настройках. Возможно это глупый вопрос, но первый раз с таким сталкиваюсь, как его вернуть , либо подскажите пожалуйста, может можно функцию какую-то прописать, чтобы wp не требовал email?
А у вас получилось перейти на страницу Настройки > Обсуждение из меню в админке WordPress?
Здравствуйте!
Взял пример с add_comment_meta() удалил 2 пункт с валидацией и заменил значение города на такое $default['fields']['city'] = '123';. После отправки комментария поле не создается вообще. Проверял в базе. Код вставил в страницу шаблона плагина, сам комментарий создается. В чем может быть проблема?
add_action только в главном файле плагина может работать?
Здравствуйте!
Сейчас проверил этот пример и всё добавилось...
Могу предположить, что вы заменили HTML-поле обычным текстом, тогда да, не будет работать.
Здравствуйте. Хорошая статья. Однако есть 2 вопроса.
1. Почему верстка формы меняется, если пользователь залогинен. Вот добавил дополнительное поле "телефон". На форме где пользователь не залогинен - все отображается. Однако стоит пользователю залогиниться - верстка меняется и нет всех полей ввода кроме "textarea"
2. Как сделать что бы для залогиненного пользователя отображалось дополнительное поле, которого исходно нет в форме отправки комментариев? И желательно, если верстку чуть менял для формы не залогиненного пользователя, то что бы та же верска (ну ясно что без полей автор и email) была та же.
Заранее спасибо.
Добрый день, Эдуард. Благодарю.
1. Предполагаю вы имеете ввиду, что при авторизации пользователя поля "Имя", "E-mail" и "Сайт" превращаются в текст "Вы вошли как...".
2. Тут действительно интересная история. Если вы добавляете поля используя этот метод, то действительно, поля будут отображаться только для неавторизованных пользователей. Думаю, что вы можете воспользоваться хуком comment_form_submit_button, чтобы дописать своё поле перед кнопкой. Для проверки, залогиненный пользователь, или нет, подойдёт функция is_user_logged_in().
Ну это прочем лишь один из вариантов, хуков в функции очень много, можно выбирать, где именно выводить поле.