Модификация кода для получения последних комментариев выше старых постов - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь получить эту работу, но она не совсем работает. Вот как я сейчас запрашиваю свои сообщения:

<?php 
    // the query
    $the_query = new WP_Query(  array( 'posts_per_page' => -1 ) ); 
    if ( $the_query->have_posts() ) : 
    ?>
        <!-- pagination here -->
        <!-- the loop -->
        <?php 
        while ( $the_query->have_posts() ) : $the_query->the_post(); 
        ?>                          
            <li data-href="<?php $zlink = get_the_permalink(); echo preg_replace("#/$#im", '', $zlink);?>">
                <div>
                    <a class="button" href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
                </div>

То, чего я пытаюсь достичь, это следующее:

  1. Показывать недавно прокомментированное сообщение поверх постов с более новой датой публикации ...
  2. Если в блог-посте есть комментарий, независимо от того, сколько лет этому блог-посту, я хочу, чтобы этот блог-пост был выше нового поста в блоге, если этот новый пост не имеет обновления (имеется в виду: нет недавних комментариев).

Я начал с показа недавно прокомментированных постов сверху (см. Ниже), но это полностью игнорирует тот факт, что есть посты без комментариев, и я не могу найти способ объединить оба и показать их в одном списке.

<?php
    $args = array(
    'status' => 'approve',
    'number' => 6,
    'order' => 'DESC'
);
$comments = get_comments($args);

foreach($comments as $comment) : $count++;

        $post_args = array(
            'post_type' => 'post',
            'p' => $comment->comment_post_ID,
            'posts_per_page' => 1
            );

        $posts = get_posts($post_args);

        foreach($posts as $post) : setup_postdata($post);

            the_title();
        endforeach;

endforeach;
?>

Может ли кто-нибудь помочь?

1 Ответ

1 голос
/ 09 мая 2019

Ниже создается пустой массив, добавляются все сообщения с комментариями к этому массиву.Затем он добавляет все сообщения без комментариев.Наконец, он сортирует их по дате комментария или дате публикации, в зависимости от того, были ли в этой записи какие-либо комментарии или нет

//create an array to stuff all your posts in
$arrAllPosts = array();

$args = array(
    'post_type'         => 'post',  //show only posts (not pages, etc)
    'comment_count'     => array(   //pass it an array
        'value'     => 1,           //value is 1, with compare means greater than or equal to 1
        'compare'   => '>='
    ),
    'posts_per_page'    => -1       //gimme all of them
);
$postsWithComments = new WP_Query($args);


while($postsWithComments->have_posts()) {$postsWithComments->the_post();
    //get the comments for this post
    $comments = get_comments(array(
        'post_id'   => get_the_ID(),    //pass the post ID
        'orderby'   => 'comment_date',  //tell it to sort by the comment date, so you only get the latest
        'number'    => 1                //just get the latest
    ));
    foreach($comments as $comment) { //we're only looping this once, since there is only one
        $arrAllPosts[] = array(
            'dateToSortBy'  => $comment->comment_date,  //we'll use comment date to sort by later, instead of the post date
            'the_post_obj'  => $post                    //add the global post object, which is currently set to the current post
        );
    }
}
//now we get the posts with no comments
$args = array(
    'post_type'         => 'post',  //Only posts (not pages, etc)
    'comment_count'     => 0,       //Posts with no comments only
    'posts_per_page'    => -1       //gimme all of them
);

$postsNoComments = new WP_Query($args); //run it

while($postsNoComments->have_posts()) {$postsNoComments->the_post();    //loop it
    $arrAllPosts[] = array(
        'dateToSortBy'  => $post->post_date,  //we'll use the post date to sort by
        'the_post_obj'  => $post            //add the global post object, which is currently set to the current post
    );

}

function date_compare($a, $b) { //create a custom function to sort the array by the date of the post or the date of the comment
    $tmA = strtotime($a['dateToSortBy']);   //convert to time
    $tmB = strtotime($b['dateToSortBy']);   //convert to time
    return ($tmA < $tmB)?true:false;
}
usort($arrAllPosts, 'date_compare');

//Display the title for each post, from the sorted list
foreach($arrAllPosts as $curPost) { 
    $post = $curPost['the_post_obj'];   //make this the global post object
    setup_postdata($post);              //setup the data
    echo "<a href='" . get_the_permalink() . "'>" . get_the_title() . "</a>";
} 
...