Здравствуйте!
Сегодняшняя статья посвящена выводу комментариев WordPress. Мы рассмотрим в каких файлах и функциях расположен код, отвечающий за отображение комментариев. Что нужно сделать, чтобы иметь возможность внести изменения в этот блок WordPress блога.
Начну с того, что в каждом шаблоне (теме) WordPress есть файл comments.php, Полный путь к нему от корневого каталога: /wp-content/themes/папка_шаблона/comments.php
Именно comments.php отвечает в целом за блок комментариев в конкретной теме WordPress.
Что чаще всего содержится в comments.php:
– проверка защиты комментариев паролем
– проверка разрешены ли комментарии к статье
– проверка наличия комментариев и вывод соответствующего текста (“Комментариев нет …” или “Оставлено n комментариев”)
– вызов функции вывода комментариев – wp_list_comments()
– вывод навигации (пейджинации) при многостраничном размещении комментариев
– вывод формы для оставления комментариев к статье
Здесь понятно, что вы можете задавать свои классы или изменять свойства в style.css для уже существующих классов. Таким образом, вы можете изменить внешний вид формы для оставления комментариев и текстов до списка комментариев и после этого списка или формы. Но стили вывода непосредственно самих комментариев в comments.php изменить нельзя.
Когда я перечислял содержимое файла comments.php, то специально отметил подчеркиванием, что в comments.php происходит всего лишь вызов функции вывода комментариев wp_list_comments(), но не сам вывод. Т.е. в comments.php вы не найдете (по крайней мере, в последних версиях WordPress и при правильном подходе к разработке шаблонов): вывод имени автора сообщения и ссылки на его сайт, вывод аватарки автора, вывод даты и времени комментария, самого комментария и ссылки “ответить”.
Как же изменить стили в списке комментариев?
Для начала нужно выяснить используется ли в вашем шаблоне пользовательская функция для вывода комментариев.
Вызов функции wp_list_comments() возможен без колбэка (callback – функция обратного вызова) и с колбэком.
1. Вызов wp_list_comments без колбэка:
1 2 3 |
<?php wp_list_comments(); ?> |
или, например, вот так (в качестве параметра передается размер аватарки)
1 2 3 |
<?php wp_list_comments('avatar_size=48'); ?> |
Т.е. в параметрах функции (то что в скобочках, после названия) нигде не фигурирует параметр с названием ‘callback’.
Если в comment.php вашего шаблона такая ситуация, то это означает, что в данной теме нет собственной (пользовательской) функции для вывода комментариев и для этого используется стандартный шаблон (шаблон из ядра WordPress). Расположен он файле /wp-includes/comment-template.php. А поскольку вносить изменения в файлы из папки wp-includes нельзя, то в данном случае изменить стили отображения комментариев не получится, пока мы не прейдем ко второму варианту.
2. Вызов wp_list_comments с колбэком:
1 2 3 |
<?php wp_list_comments('type=comment&avatar_size=48&callback=custom_comment'); ?> |
callback=custom_comment указывает, что для вывода комментариев у нас есть пользовательская функция custom_comment, код которой, грубо говоря, мы и передаем в качестве параметра для исполнения в стандартную функцию wp_list_comments. Но нас интересует больше не техническая сторона этого вопроса, а именно наличие в шаблоне собственной функции для вывода комментариев. Код этой функции расположен в файле functions.php.
Вот именно в этой пользовательской функции custom_comment и расположен код, отвечающий за внешний вид отдельного комментария, а следовательно и всех комментариев в целом.
Код пользовательской функции интуитивно понятный. В нем, обычно, используются следующие стандартные функции WordPress:
get_avatar() – получить аватар автора комментария;
get_comment_author_link() – получает html ссылку на сайт автора текущего комментария;
get_comment_date() – получает дату комментария;
get_comment_time() – получает время комментария;
comment_text() – выводит текст комментария;
comment_reply_link() – выводит ссылку “Ответить”;
Вы можете находить фрагменты с этими функциями в коде и изменять внешний вид тех или иных элементов, обрамляя их в блоки div или span и присваивая определенные классы стилей.
Например, в коде пользовательской функции фрагмент вывода аватарки:
1 2 3 4 5 |
<div class="comment-author"> <?php if ( 0 != $args['avatar_size'] ) echo get_avatar( $comment, $args['avatar_size'] ); ?> </div> |
Теперь осталось в style.css задать желаемые свойства классу comment-author. Подробней конкретные примеры изменения стилей рассмотрю в одной из следующих статей.
Теперь у вас может возникнуть вопрос: “Что делать, если в моем шаблоне нет пользовательской функции для вывода комментариев?”
Ответ: нужно создать её.
Самый простой вариант – скопировать код стандартной функции WordPress comment().
Инструкция по созданию пользовательской функции для вывода комментариев:
1. Откройте файл /wp-includes/comment-template.php и найдите в нем функцию comment().
Вот начало её описания
1 2 3 4 5 6 7 8 9 10 11 |
/** * @since 3.6 * @access protected * * @param object $comment Comment to display. * @param int $depth Depth of comment. * @param array $args Optional args. */ protected function comment( $comment, $depth, $args ) { |
2. Скопируйте все тело функции comment().
Скопировать нужно фрагмент кода от начала описания, показанного в пункте 1 до закрывающейся фигурной скобки } и следующего за ней подобного описания другой функции
3. Вставьте скопированный код в файл functions.php вашего шаблона.
4. Измените название функции, например на custom_comment и добавьте в начале функции строку $GLOBALS[‘comment’] = $comment;
1 2 3 4 |
function custom_comment( $comment, $args, $depth) { $GLOBALS['comment'] = $comment; |
5. В файле comments.php вашего шаблона найдите вызов функции wp_list_comments() и добавьте параметры type=comment и callback=custom_comment.
Должно получиться вот так:
1 2 3 |
<?php wp_list_comments('type=comment&callback=custom_comment'); ?> |
Таким образом, вы создадите собственную функцию для вывода комментариев и сможете вносить любые изменения касательно их внешнего вида.
Итак, мы научились определять наличие в шаблоне WordPress пользовательской функции для вывода комментариев и создавать её в случае отсутствия таковой.
Напишите, пожалуйста, является ли данная информация для вас новой и доступно ли она изложена в данной статье? Нужны ли какие-то дополнительные объяснения?
Спасибо за внимание!
Красивых вам комментариев!
Я себе на одном блоге хочу сделать круглые аватарки, например
подскажите как изменить или удалить в форме комментирования надпись – добавить комментарий. У Вас – оставить комментарий.
У меня эта надпись выводится в файле /wp-content/themes/название_шаблона/comments.php с помощь функции comment_form_title. Вот так:
Чтобы найти нужный фрагмент кода, можете проинспектировать элемент “Добавить комментарий” и посмотреть id блока в котором находится надпись. Например, у меня это id=”respond”. И потом выполните поиск по всем файла проекта по этому идентификатору: id=”respond”.
Ваша статья мне ОЧЕНЬ помогла!
Не было в стандартной теме даты и времени комментария. Была та самая функция с колбэком. Я скопировала из стандартной функции вывода комментария вывод даты/времени, и вставила после вывода текста.
Стало выводится, но в формате ссылки, нажимая на которую, наверху экрана становится следующий комментарий.
Но лучше уж так, чем совсем без даты…
У меня сайтбар слетел.. Восстановил как было, со второго попытки вроде заработало. Делайте бэкап перед тем как ковырять код!
Спасибо, Алексей, огромное за полезную статью- всё получилось с первого раза. Я менял вывод стандартных кнопок «Ответить», которые выводятся через replytocom и создают кучу дублей тегом .
Оказалось, что комментарии у меня выводятся через comment-template.php и, чтобы не редактировать каждый раз этот файл при обновлении WordPress решил сделать вывод комментариев через файлы темы. И вот тут начались проблемы… Несколько вечеров убил пока не нашел в поиске вашу статью- всё просто и понятно описано. Спасибо ещё раз!
Спасибо и Вам, Юрий, за отзыв. Рад, что статья оказалось полезной. Успехов в Вашем творчестве!
Алексей, очень подробная и качественная статья! Если я когда-нибудь решусь сделать что-то подобное на своём сайте, обязательно буду следовать этой инструкции. А пока не могу разобраться со своими баранами, которые как раз с комментариями и связаны. Может быть, вы сможете дать какой-то совет, раз так глубоко разбираетесь в этой теме?
Дело в том, что я недавно столкнулась со странной проблемой. После установки новой версии WordPress при вводе комментария не высвечивается фраза премодерации о том, что комментарий скоро будет одобрен, а человека перебрасывает на эту же страницу, но без каких-либо сообщений от сайта (при этом страница перезагружается, хотя ранее просто появлялся коммент с статусе модерации). Раньше всё работало, но в какой момент произошла эта ошибка, сложно отследить — возможно, она появилась даже раньше обновления CMS. Откатила версию вордпресс — безрезультатно. Как вы думаете, в чём в этом случае может быть корень зла? Если честно, не знаю, что делать. Буду благодарна за любые советы.
Добрый день, а как сделать вывод двух блоков независимых комментариев в одном посте? Спасибо
И вновь я возвращаюсь на Ваш замечательный сайт) (Подписана)
У меня такая проблемка: перелинковка статей отражается в комментариях: prntscr.com/854gjl, т.е — ВП КАЖДУЮ ссылку из одной статьи на другую воспринимает, как коммент.
Живых комментариев там пока нет, сайт ещё не проиндексирован.
Вопрос: А КАК убрать подобное?
Буду благодарна за ответ.
(Шаблон купила готовый с установкой на хостинг, ВП только постингаю и пока совсем в нём не разбираюсь, я — контенщик.)
Не нашла, куда в тему написать свой вопросец)) пишу сюда, сорри.
5 дней назад открыла сайт для индексации поисковиками и… полетели мне такие реги от “пользователей” на почту с одноразовых почтовых ящиков:
На вашем сайте «Мой сайт» зарегистрирован новый пользователь:
От кого: wordpress@мой сайт.ru
Имя пользователя: LowellPaschke5
E-mail: veronaliriano@spambog.ru
Подскажите пожалуйста:
1. Для ЧЕГО спамеры (или боты?) это делают (поскольку обратных линков в консоли я не обнаружила)
2. Как избавиться от подобных псевдорегистраций?
Спасибо за статью.
Каким образом можно добавить дополнительную функцию в custom_comment? Например, добавить статус автора, который он укажет в своем личном кабинете.
Добрый день. Есть проблема, разбиваю комментарии на странице и вывожу сначала более поздние. Но если комментарии разбиты по 25 штук на страницу, а всего 26 комментариев, то на оригинальной странице будет всего 1 комментарий, а остальные 25 будут на второй странице. Вот пример https://azmlm.com/sashproject/
Как сделать так, чтоб на оригинальной странице выводилось 25 комментариев, а не остатки от пагинации??? Спасибо.