wp_list_comments() – функция вывода комментариев

Обычно эту функцию можно встретить внутри файла 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

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: