Для того, чтобы вывести все комментарии сайта (а не только для текущей страницы), мы разработали такой код:
<?php $comments = get_comments([
'status' => 'approve', // Только одобренные комментарии
'orderby' => 'comment_date_gmt', // Сортировка по дате
'order' => 'DESC', // Порядок вывода: старые сначала
]);?>
<?php
// Группируем комментарии по их родителям
$grouped_comments = group_comments_by_parent($comments);
// Выводим комментарии
if (!empty($comments)) {
render_all_comments($comments, $grouped_comments);
} else {
echo '<p>' . __('No comments found.') . '</p>';
}
?>
// Функция для группировки комментариев по родителю
function group_comments_by_parent($comments) {
$grouped = array();
foreach ($comments as $comment) {
$parent_id = $comment->comment_parent;
if (!isset($grouped[$parent_id])) {
$grouped[$parent_id] = array();
}
$grouped[$parent_id][] = $comment;
}
return $grouped;
}
// Функция для рекурсивного отображения комментариев
function render_all_comments($comments, $grouped, $parent_id = 0, $depth = 0) {
if (isset($grouped[$parent_id])) {
foreach ($grouped[$parent_id] as $comment):?>
<article class="comment <?php if($comment->comment_parent):?>reply<?php endif;?>" id="<?php echo $comment->comment_ID;?>">
<header class="author-data">
<?php $date = new DateTime($comment->comment_date);?>
<address class="author" rel="author"><?php echo $comment->comment_author;?></address>
<time pubdate datetime="<?php echo $date->format('Y-m-d');?>" title="<?php echo $date->format('F d Y');?>"><?php echo $date->format('h:m:s');?> <span><?php echo $date->format('d.m.Y');?></span></time>
</header>
<div class="comment-content"><?php echo $comment->comment_content;?></div>
</article>
<?php
// Рекурсивно отображаем ответы на текущий комментарий
render_all_comments($comments, $grouped, $comment->comment_ID, $depth + 1);
?>
<?php endforeach;?>
<?php }
}
Получение комментариев
<?php $comments = get_comments([
'status' => 'approve',
'orderby' => 'comment_date_gmt',
'order' => 'DESC',
]);?>
Функция get_comments
получает комментарии:
status
: только одобренные.orderby
: сортируются по дате.order
: выводятся в обратном порядке (сначала новые).
Группировка комментариев
$grouped_comments = group_comments_by_parent($comments);
Функция group_comments_by_parent
распределяет комментарии по родителям. Это нужно для отображения иерархии (комментарий-ответ).
function group_comments_by_parent($comments) {
$grouped = array();
foreach ($comments as $comment) {
$parent_id = $comment->comment_parent; // ID родительского комментария
if (!isset($grouped[$parent_id])) {
$grouped[$parent_id] = array(); // Создаем массив для родителя, если его еще нет
}
$grouped[$parent_id][] = $comment; // Добавляем комментарий в группу
}
return $grouped;
}
Отображение комментариев
if (!empty($comments)) {
render_all_comments($comments, $grouped_comments);
} else {
echo '<p>' . __('No comments found.') . '</p>';
}
Если есть комментарии, вызывается функция render_all_comments
для их отображения.
Функция render_all_comments
function render_all_comments($comments, $grouped, $parent_id = 0, $depth = 0) {
if (isset($grouped[$parent_id])) {
foreach ($grouped[$parent_id] as $comment):?>
<article class="comment <?php if($comment->comment_parent):?>reply<?php endif;?>" id="<?php echo $comment->comment_ID;?>">
<header class="author-data">
<?php $date = new DateTime($comment->comment_date);?>
<address class="author" rel="author"><?php echo $comment->comment_author;?></address>
<time pubdate datetime="<?php echo $date->format('Y-m-d');?>" title="<?php echo $date->format('F d Y');?>"><?php echo $date->format('h:m:s');?> <span><?php echo $date->format('d.m.Y');?></span></time>
</header>
<div class="comment-content"><?php echo $comment->comment_content;?></div>
</article>
<?php
render_all_comments($comments, $grouped, $comment->comment_ID, $depth + 1);
?>
<?php endforeach;?>
<?php }
}
Эта функция:
- Рекурсивно отображает комментарии: сначала выводит корневые, затем вложенные.
- Выводит данные комментария:
- Автор:
<?php echo $comment->comment_author;?>
. - Дата и время:
<?php $date->format(); ?>
. - Текст комментария:
<?php echo $comment->comment_content;?>
.
- Автор:
- Рекурсивно вызывает себя для вложенных комментариев, передавая ID текущего комментария как
parent_id
.
Резюме
- Модулярность: Код хорошо структурирован с использованием функций (
group_comments_by_parent
иrender_all_comments
). - Поддержка вложенности: Рекурсия позволяет отображать вложенные комментарии.
- Адаптируемость: Можно легко изменить структуру и оформление вывода, редактируя
render_all_comments
.
Этот шаблон подходит для страниц, где нужно отображать отзывы или комментарии с возможностью ответа.