Обычно эту функцию можно встретить внутри файла comments.php
, где она находится для вывода комментариев к определённой записи / странице / CPT.
wp_list_comments( $args = array(), $comments = null )
В случае использования этой функции где-либо кроме вышеупомянутого случая, вам понадобится указать второй параметр.
- $args
- (массив) Массив параметров функции.
- style
- (строка) При выводе комментарии по умолчанию выводятся при помощи тега маркированного списка
<ul>
(это я имею ввиду дочерние комменты), но мы можем указать значениеol
, или дажеdiv
– тогда всё будет на дивах. - max_depth
- (целое) В случае включения в админке древовидных комментариев, этот параметр функции позволяет установить максимальный параметр вложенности комментариев вне зависимости от значения в админке.
- type
- (строка) Как вы возможно знаете, в WordPress, помимо стандартного типа комментариев
comment
, существуют также пингиpings
, которые в свою очередь ещё подразделяются наpingback
иtrackback
. По умолчанию этот параметр имеет значениеall
– то есть выводит все типы, но вы можете указать только какой-либо определённый тип. - per_page
- (целое) Сколько комментариев отображать на одной странице при разбивке на постраничную навигацию. По умолчанию будет использоваться параметр из Настройки > Обсуждение, однако вы можете передать здесь собственное значение. Если вы укажете 0, то вообще не будет добавлено постраничной навигации.
- page
- (целое) При разбивке на постраничную навигацию можно указать страницу, которую вы хотите сейчас отображать.
- avatar_size
- (целое) Высота и ширина аватара пользователей в комментах, по умолчанию
32
. - reverse_top_level
- (логическое) Нужно ли отображать сначала более поздние комментарии сверху? Да, если установить значение
true
. По умолчанию – значение из настроек. - reverse_children
- (логическое) Установите
true
, если вы хотите, чтобы дочерние комментарии выводились в обратном порядке. - echo
- (логическое) Возвращать (
false
, по умолчанию) или выводить (true
) результат. - callback
- (строка) Вы можете указать здесь название функции и потом создать её где-нибудь в
functions.php
, которая будет содержать HTML комментария - end-callback
- (строка) Примерно то же самое, что и предыдущий параметр, но позволяет перезаписать функцию, закрывающую тег комментария (подробнее в примерах).
- walker
- (объект) Указываем объект класса, который будет перезаписывать методы класса по умолчанию
Walker_Comment
, напримерnew Misha_Comment()
.
- $comments
- (массив) Если вдруг так получится, что вы будете использовать
wp_list_comments()
не там, где нужно, а именно за пределами подключенного функцией comments_template() файла, то сюда надо будет передать массив объектовWP_Comment
, потому что он не будет существовать вероятно в виде глобального. Этот массив можно передать при помощи например функции get_comments().
Примеры
Самый изишный способ использования функции:
echo '<ul class="commentlist">' . wp_list_comments( array( 'echo' => false ) ) . '</ul>';
И ещё один пример, чтобы наверняка:
echo '<ol class="commentlist">'; wp_list_comments( array( 'style' => 'ol' ) ); echo '</ol>';
Как создать произвольную функцию вывода комментария?
Давайте здесь рассмотрим параметры callback
и end-callback
, потому что в реальной жизни с ними приходится сталкиваться ну очень часто.
Сначала мы указываем эти параметры в функции:
wp_list_comments( array( 'callback' => 'misha_comment', 'end-callback' => 'misha_end_comment' ) );
Затем нам нужно создать эти функции внутри нашего файла functions.php
:
function misha_comment( $comment, $args, $depth ){ ?><li <?php comment_class() ?> id="comment-<?php comment_ID() ?>"> <div class="comment-body"> <?php echo get_avatar( $comment, 70, '', '', array( 'class' => 'comment-avatar' ) ) ?> <div class="comment-content"> <span class="comment-author"><?php comment_author() ?></span> <span class="comment-date"><?php comment_date( 'j F Y в H:i' ) ?></span> <?php comment_text() ?> </div> </div> <?php // без закрывающего </li> (!) }
Прежде всего важное уточнение – это оооочень упрощённый код. Он рабочий безусловно, но для определённых параметров функции и для определённых настроек обсуждения. Например тут нет кода, который выводит уведомление, что коммент отправлен на модерацию, а также если вы вдруг захотите выводить комментарии при помощи тегов <div>
, то эта функция вам не подойдэт, так как использует тег <li>
.
В паре слов про этот код:
- Функция получает в качестве аргументов три параметра:
$comment
– объект выводимого комментария,$args
– тупо все параметрыwp_list_comments()
,$depth
– глубина текущего комментария. - comment_class() аналогична функции post_class(), за тем исключением, что она нужна для комментариев.
- comment_ID() – выводит не много не мало – ID комментария, а вообще создание атрибута
id="comment-XXX"
обязательно (!), потому что при публикации комментария пользователя редиректит к нему при помощи ссылки-якоря. - get_avatar() – позволяет получить и вывести фото пользователя в сервисе Gravatar.
- comment_author() – выводит имя автора комментария.
- comment_date() – очень похожа на the_time() для постов.
- Ну и comment_text() выводит текст комментария.
Вопрос – а почему мы не закрыли тег <li>
? А потому что это нужно для корректного вывода дочерних комментариев + мы можем закрыть тег в нашей другой кастом функции – misha_end_comment()
.
function misha_end_comment( $comment, $args, $depth ){ echo '</li>'; }
В данном случае показан вывод по умолчанию, но вы теперь уже сами знаете, как его изменить, если захотите.
Источник: misha.blog