Вопрос или проблема
Я хочу получить 5 самых последних комментариев и 5 самых последних ответов (дочерних) на каждый комментарий в порядке убывания. С помощью следующего кода я могу получить 5 самых последних комментариев, но он не различает комментарии и ответы, что приводит к списку комментариев независимо от их ‘типа’ (комментарий или ответ). Как это можно сделать?
<?php
$comments = get_comments(array(
'post_id' => $id,
'status' => 'approve',
'number' => '5' //Количество комментариев
));
if ( have_comments() ) : ?>
<?php $args = array(
'walker' => null,
'max_depth' => '2',
'style' => 'div',
'callback' => customComment, // templates/comment-template.php
'end-callback' => null,
'type' => 'all',
'reply_text' => 'Ответить',
'page' => '',
'per_page' => '',
'avatar_size' => 32,
'reverse_top_level' => false,
'reverse_children' => false,
'format' => 'html5', // или 'xhtml' если нет поддержки 'HTML5' темы
'short_ping' => false, // @since 3.6
'echo' => true // boolean, по умолчанию true
); ?>
<?php wp_list_comments( $args ); ?>
Чтобы вывести самые последние (5) комментарии, можно использовать этот код :
$sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID,
comment_post_ID, comment_author, comment_date_gmt, comment_approved,
comment_type,comment_author_url,
SUBSTRING(comment_content,1,50) // КОЛИЧЕСТВО СИМВОЛОВ
AS com_excerpt FROM $wpdb->comments
LEFT OUTER JOIN $wpdb->posts
ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID)
WHERE comment_approved = '1'
AND comment_type=""
AND post_password = ''
ORDER BY comment_date_gmt
DESC LIMIT 5"; // КОЛИЧЕСТВО КОММЕНТАРИЕВ
$comments = $wpdb->get_results($sql);
$output = $pre_HTML;
$output .= "\n<ul>";
foreach ($comments as $comment) {
$output .= "\n<li>"."<a href=\"" . get_permalink($comment->ID) .
"#comment-" . $comment->comment_ID . "\" title=\"on " .
$comment->post_title . "\">" .strip_tags($comment->comment_author)
.":<br/><div>" . strip_tags($comment->com_excerpt)
."</div></a></li>";
}
$output .= "\n</ul>";
$output .= $post_HTML;
echo $output;
?>
Это выведет комментарии в следующей HTML-разметке:
<ul>
<li>
<a href="http://domain.tld/post#comment-01" title="на Заголовок поста">Автор комментария:<br />
<div>Это первые 50 символов первого самого последнего комментария</div></a>
</li>
<li>
<a href="http://domain.tld/post#comment-01" title="на Заголовок поста">Автор комментария:<br />
<div>Это первые 50 символов первого самого последнего комментария</div></a>
</li>
<li>
<a href="http://domain.tld/post#comment-01" title="на Заголовок поста">Автор комментария:<br />
<div>Это первые 50 символов первого самого последнего комментария</div></a>
</li>
<li>
<a href="http://domain.tld/post#comment-01" title="на Заголовок поста">Автор комментария:<br />
<div>Это первые 50 символов первого самого последнего комментария</div></a>
</li>
<li>
<a href="http://domain.tld/post#comment-01" title="на Заголовок поста">Автор комментария:<br />
<div>Это первые 50 символов первого самого последнего комментария</div></a>
</li>
</ul>
Но я не уверен, как можно вывести дочерние элементы комментария.. Возможно, что-то вроде этого должно дать вам первый последний ответ на комментарий, но вам придется настроить его для работы:
$args = array(
'status' => 'approve',
'number' => '5',
'post_id' => $post_id,
'parent' => $parrent
);
$comments = get_comments($args);
.
Ответ или решение
Чтобы получить пять самых последних комментариев и к каждому из них пять самых последних ответов (детей) в обратном порядке, необходимо учесть, что структура данных комментариев в WordPress по своей природе иерархична. Давайте разберем решение для этой задачи, шаг за шагом.
Получение последних комментариев
Начнем с получения пяти самых последних комментариев к посту. Используем функцию get_comments()
и зададим сортировку по дате в обратном порядке:
$comments = get_comments(array(
'post_id' => $id,
'status' => 'approve',
'number' => 5,
'orderby' => 'comment_date',
'order' => 'DESC',
'parent' => 0 // Получаем только корневые комментарии
));
Получение последних ответов к каждому комментарию
После получения списка пяти последних комментариев, необходимо пройтись по каждому из них и получить их детей (ответы). Для этого снова используем функцию get_comments()
, но указываем идентификатор родителя:
foreach ($comments as $comment) {
$replies = get_comments(array(
'status' => 'approve',
'number' => 5,
'orderby' => 'comment_date',
'order' => 'DESC',
'parent' => $comment->comment_ID // Указываем ID родительского комментария
));
// Здесь вы можете обрабатывать и выводить ответы к каждому комментарию
}
Пример вывода
Для визуализации данной структуры можно использовать HTML, учитывая, что каждый комментарий будет обернут в список с его ответами:
echo "<ul>";
foreach ($comments as $comment) {
echo "<li>";
echo "<strong>Автор:</strong> " . esc_html($comment->comment_author) . "<br/>";
echo "<div>" . esc_html($comment->comment_content) . "</div>";
$replies = get_comments(array(
'status' => 'approve',
'number' => 5,
'orderby' => 'comment_date',
'order' => 'DESC',
'parent' => $comment->comment_ID
));
if (!empty($replies)) {
echo "<ul>";
foreach ($replies as $reply) {
echo "<li>";
echo "<strong>Ответ от:</strong> " . esc_html($reply->comment_author) . "<br/>";
echo "<div>" . esc_html($reply->comment_content) . "</div>";
echo "</li>";
}
echo "</ul>";
}
echo "</li>";
}
echo "</ul>";
Заключение
С помощью такого подхода можно получить иерархические данные комментариев и их ответов в требуемом порядке. Важно помнить о безопасности, проверяя и экранируя данные перед выводом их на страницу, чтобы избежать XSS-атак. Таким образом, вы получите структурированный и надежный вывод последних комментариев и их ответов.
Это решение фокусируется на практическом и безопасном подходе к обработке данных комментариев в WordPress, что позволяет эффективно управлять взаимодействием пользователей с контентом.