Вывод комментариев в WordPress с ответами

Для того, чтобы вывести все комментарии сайта (а не только для текущей страницы), мы разработали такой код:

<?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 }
}

Эта функция:

  1. Рекурсивно отображает комментарии: сначала выводит корневые, затем вложенные.
  2. Выводит данные комментария:
    • Автор: <?php echo $comment->comment_author;?>.
    • Дата и время: <?php $date->format(); ?>.
    • Текст комментария: <?php echo $comment->comment_content;?>.
  3. Рекурсивно вызывает себя для вложенных комментариев, передавая ID текущего комментария как parent_id.

Резюме

  1. Модулярность: Код хорошо структурирован с использованием функций (group_comments_by_parent и render_all_comments).
  2. Поддержка вложенности: Рекурсия позволяет отображать вложенные комментарии.
  3. Адаптируемость: Можно легко изменить структуру и оформление вывода, редактируя render_all_comments.

Этот шаблон подходит для страниц, где нужно отображать отзывы или комментарии с возможностью ответа.

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