Функция wp_list_comments()
предназначена для вывода списка комментариев к посту или странице в WordPress. Эта функция может принимать различные параметры, позволяющие настроить отображение комментариев. Важно понимать, что сама функция wp_list_comments()
не обрабатывает комментарии, а лишь выводит их. Она должна быть вызвана из файла шаблона комментариев, такого как comments.php
, который подключается с помощью функции comments_template()
.
wp_list_comments( array $args = array(), array $comments = array() );
Аргументы параметра $args
- walker (object): Экземпляр класса, который отвечает за вывод списка комментариев. По умолчанию используется класс
Walker_Comment
. - max_depth (int): Глубина вложенности комментариев. Работает, если включена поддержка древовидных комментариев. Устанавливается в админ-панели.
- style (string): Формат списка комментариев. Возможные значения:
div
,ol
,ul
. Например:
<div class="commentlist">
<?php wp_list_comments(array('style' => 'div')); ?>
</div>
- callback (string): Название функции, которая формирует HTML-вывод каждого комментария. Функция должна содержать открывающий тег
<div>
или<li>
(в зависимости от параметраstyle
). Пример функцииcallback
:
function mytheme_comment($comment, $args, $depth) {
// код для вывода комментария
}
- end-callback (string): Название функции, которая формирует HTML-вывод закрытия каждого комментария.
- type (string): Тип комментариев для отображения. Возможные значения:
all
,comment
,trackback
,pingback
,pings
.pings
включает в себяtrackback
иpingback
. - per_page (int): Количество комментариев на странице. Если установлено
0
, комментарии не будут разбиты на страницы. - page (int): Страница пагинации для отображения комментариев.
- avatar_size (int): Размер аватара в пикселях.
- reverse_top_level (bool): Если установлено
true
, самые последние комментарии будут отображаться первыми. - reverse_children (bool): Если установлено
true
, дочерние комментарии будут отображаться в обратном порядке. - reply_text (string): Текст ссылки «Ответить».
- login_text (string): Текст для не зарегистрированных пользователей, если комментирование доступно только зарегистрированным пользователям.
- echo (bool): Если
true
, выводит HTML на экран, еслиfalse
, возвращает HTML для дальнейшей обработки.
Шаблон использования
<ul class="commentlist">
<?php
wp_list_comments(array(
'walker' => null,
'max_depth' => '',
'style' => 'ul',
'callback' => null,
'end-callback' => null,
'type' => 'all',
'reply_text' => 'Reply',
'page' => '',
'per_page' => '',
'avatar_size' => 32,
'reverse_top_level' => null,
'reverse_children' => '',
'format' => 'html5',
'short_ping' => false,
'echo' => true,
));
?>
</ul>
Возвращаемое значение
- null или string: Возвращает HTML-строку списка комментариев при параметре
echo=1
. Возвращаетnull
, когда параметрecho=0
.
Хуки из функции
wp_list_comments_args
Пример использования:
В файле, где нужно вставить комментарии:
<?php comments_template('/comments.php'); ?>
В файле comments.php
:
<div>
<?php wp_list_comments(); ?>
</div>
Функция comments_template()
получает комментарии из базы данных, которые затем обрабатываются wp_list_comments()
. Если функция comments_template()
не используется, можно передать комментарии напрямую во втором параметре функции wp_list_comments()
.
Пример 1: Вывод комментариев с использованием стандартного шаблона
Для вывода списка комментариев с использованием стандартного шаблона можно использовать следующую конструкцию:
// Выводим список комментариев в виде упорядоченного списка
wp_list_comments();
Этот код выведет список комментариев в виде упорядоченного списка (<ol>
), используя стандартный шаблон форматирования.
Пример 2: Вывод комментариев в виде неупорядоченного списка
Если вы хотите отобразить комментарии в виде неупорядоченного списка, используйте параметр style
:
// Выводим список комментариев в виде неупорядоченного списка
wp_list_comments( array( 'style' => 'ul' ) );
Этот код выведет комментарии в виде неупорядоченного списка (<ul>
).
Пример 3: Использование функции обратного вызова для форматирования комментариев
Можно использовать параметр callback
для задания пользовательской функции форматирования комментариев:
<?php
// Определяем функцию обратного вызова для форматирования комментариев
function my_custom_comment_format( $comment, $args, $depth ) {
$GLOBALS['comment'] = $comment;
?>
<li <?php comment_class(); ?> id="comment-<?php comment_ID(); ?>">
<article id="div-comment-<?php comment_ID(); ?>" class="comment-body">
<footer class="comment-meta">
<div class="comment-author vcard">
<?php echo get_avatar( $comment, 48 ); ?>
<?php printf( __( '%s <span class="says">says:</span>' ), sprintf( '<b class="fn">%s</b>', get_comment_author() ) ); ?>
</div><!-- .comment-author -->
</footer><!-- .comment-meta -->
<div class="comment-content">
<?php comment_text(); ?>
</div><!-- .comment-content -->
<div class="reply">
<?php comment_reply_link( array_merge( $args, array( 'reply_text' => 'Reply', 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?>
</div><!-- .reply -->
</article><!-- .comment-body -->
</li>
<?php
}
// Выводим комментарии с использованием пользовательской функции форматирования
wp_list_comments( array( 'callback' => 'my_custom_comment_format' ) );
Этот код использует пользовательскую функцию my_custom_comment_format()
для форматирования каждого комментария. Параметр callback
позволяет гибко настраивать отображение комментариев, что полезно для создания уникального внешнего вида комментариев на сайте.
Пример 4: Вывод комментариев для определенного поста
Для отображения комментариев только для определенного поста, сначала получаем комментарии, а затем передаем их в wp_list_comments()
:
<ol class="commentlist">
<?php
$comments = get_comments(array(
'post_id' => 123,
'status' => 'approve'
));
wp_list_comments(array(
'per_page' => 10,
'reverse_top_level' => false
), $comments);
?>
</ol>
Пример 5: Использование параметра walker
и создание своего класса
Создайте свой класс Walker для кастомизации вывода комментариев:
<?php
if (post_password_required()) {
return;
}
if (have_comments()) {
?>
<div class="comments" id="comments">
<?php
wp_list_comments(array(
'walker' => new Custom_Walker_Comment(),
'avatar_size' => 120,
'style' => 'div',
));
?>
</div><!-- .comments -->
<?php
}
?>
Теперь определите класс Walker
:
<?php
class Custom_Walker_Comment extends Walker_Comment {
/**
* Generate the HTML for a single comment.
*
* @param WP_Comment $comment Comment object.
* @param int $depth Depth of the current comment.
* @param array $args Arguments for the comment.
*/
protected function html5_comment($comment, $depth, $args) {
$tag = ('div' === $args['style']) ? 'div' : 'li';
?>
<<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class($this->has_children ? 'parent' : '', $comment); ?>>
<article id="div-comment-<?php comment_ID(); ?>" class="comment-body">
<footer class="comment-meta">
<div class="comment-author vcard">
<?php
$comment_author_url = get_comment_author_url($comment);
$comment_author = get_comment_author($comment);
$avatar = get_avatar($comment, $args['avatar_size']);
if (0 !== $args['avatar_size']) {
if (empty($comment_author_url)) {
echo wp_kses_post($avatar);
} else {
printf('<a href="%s" rel="external nofollow" class="url">', esc_url($comment_author_url));
echo wp_kses_post($avatar);
echo '</a>';
}
}
printf(
'<span class="fn">%1$s</span><span class="screen-reader-text says">%2$s</span>',
esc_html($comment_author),
__('says:', 'your-text-domain')
);
if (!empty($comment_author_url)) {
echo '</a>';
}
?>
</div><!-- .comment-author -->
<div class="comment-metadata">
<?php
printf(
'<a href="%s">%s</a>',
esc_url(get_comment_link($comment->comment_ID)),
sprintf(
__('%1$s at %2$s', 'your-text-domain'),
get_comment_date('', $comment),
get_comment_time()
)
);
if (current_user_can('edit_comment', $comment->comment_ID)) {
edit_comment_link(__('(Edit)', 'your-text-domain'), ' ', '');
}
?>
</div><!-- .comment-metadata -->
</footer><!-- .comment-meta -->
<div class="comment-content">
<?php comment_text(); ?>
</div><!-- .comment-content -->
<div class="reply">
<?php
comment_reply_link(array_merge(
$args,
array(
'add_below' => 'div-comment',
'depth' => $depth,
'max_depth' => $args['max_depth']
)
));
?>
</div><!-- .reply -->
</article><!-- .comment-body -->
</<?php echo $tag; ?>>
<?php
}
}
?>
Объяснение:
html5_comment
: Основной метод, который формирует HTML разметку для каждого комментария. Здесь вы можете настроить разметку по своему усмотрению.$tag
: Определяет, будет ли комментарий обернут вdiv
илиli
, в зависимости от параметраstyle
.comment_class
: Добавляет CSS-классы к элементу комментария, включая класс'parent'
, если у комментария есть ответы.wp_kses_post
: Используется для безопасности при выводе HTML-кода, чтобы предотвратить возможные XSS-атаки.esc_url
иesc_html
: Используются для экранирования URL и текста соответственно.comment_reply_link
: Выводит ссылку для ответа на комментарий, учитывая текущий уровень вложенности и максимальный уровень вложенности комментариев.
Этот пример демонстрирует, как можно кастомизировать вывод комментариев в WordPress, создавая свой собственный класс Walker
.
Заключение
Функция wp_list_comments()
предоставляет гибкость для отображения комментариев, позволяя разработчикам настраивать внешний вид и функциональность в зависимости от потребностей сайта. Используя различные параметры и пользовательские классы, можно легко адаптировать вывод комментариев под любой дизайн и требования.