Как добавить фильтр post_distinct в WP_Comment_Query?

Я хочу получить список сообщений с самыми последними комментариями. Однако я не хочу просто получать последние комментарии и иметь дубликаты сообщений, но я хочу группировать сообщения (по их идентификатору). Я попробовал следующее (особенно важно: код находится в методе widget () класса виджета):

function distinct() { return "DISTINCT"; } add_filter('posts_distinct', 'distinct'); $args = array( 'number' => 8 ); $query = new WP_Comment_Query; $comments = $query->query($args); 

Фильтр posts_distinct казался правильным способом достижения этого, но он не вызывается и не работает. Другой подход с posts_groupby тоже не работает:

 add_filter('posts_groupby', 'groupby' ); function groupby($groupby) { global $wpdb; $groupby = "{$wpdb->posts}.ID"; return $groupby; } 

Как я могу заставить WP_Comment_Query вернуть 8 замечательных сообщений?

Я знаю, что я мог бы просто использовать необработанный SQL-запрос, но после часа бесплодного googling я действительно задаюсь вопросом, как решить эту проблему способом WP.

Solutions Collecting From Web of "Как добавить фильтр post_distinct в WP_Comment_Query?"

Хорошо, я понял, что get_comments () предназначен только для … хороших комментариев. Следующий не очень изящный, но он работает как минимум.

 $i = 0; while (count($comments) < $number) { $comment = get_comments( apply_filters( 'widget_comments_args', array( 'number' => 1, 'status' => 'approve', 'post_status' => 'publish', 'offset' => $i ) ) ); if (!isset($comment[0])) break; $comment = $comment[0]; // unwrap $comments[$comment->comment_post_ID] = $comment; $i++; } // Sort by date // @ to avoid this bug: https://bugs.php.net/bug.php?id=50688 @usort($comments, function ($a, $b) { return get_the_date('U', $a->comment_post_ID) < get_the_date('U', $b->comment_post_ID); }); 

То, что вы хотите, может быть сделано немного легче.

Запустите WP_comments_Query в фоновом режиме, чтобы получить массив идентификаторов сообщений с датами их комментариев. Затем используйте этот массив в обычном WP_Query . Если вы хотите получить комментарий, вы также можете использовать функцию get_comments . Вот пример:

 // For performance, limit the number of queried comments, // but make it be something big enough to account for "duplicate" posts. $comments_query = new WP_Comment_Query; $comments = $comments_query->query( array( 'number' => '100' ) ); if ( $comments ) { foreach ( $comments as $comment ) { // You'll want to convert the dates from string to integer so you can sort them out later $comment_utf = strtotime($comment->comment_date); // Build an array of post IDs with the date of the last published comment $latest_comments[$comment->comment_post_ID] = $comment_utf; }} // Sort the array by date arsort($latest_comments); foreach ($latest_comments as $key => $value) { $posts_ordered[] = $key; } // The nice thing is that WP_Query will remove duplicates by default $args = array ( 'posts_per_page' => '10', 'post__in' => $posts_ordered, 'orderby' => 'post__in'); $query = new WP_Query( $args ); if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // Do your stuff (add the template or whatever) // If you want to add the comment itself, use this: $comments = get_comments(array('number' => '1', 'post_id' => $post->ID)); foreach($comments as $comment) : echo $comment->comment_content; endforeach; // That's about it }} wp_reset_postdata();