Как получить 5 самых последних комментариев и по 5 самых последних ответов (дочерних комментариев) на каждый из них.

Вопрос или проблема

Я хочу получить 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, что позволяет эффективно управлять взаимодействием пользователей с контентом.

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

Капча загружается...