我之前的 如何使用 WordPress 文章查询排序相关的参数 中详细介绍了文章查询的排序参数,其中介绍可以通过评论数进行排序:
- $query = new WP_Query( array(
- 'orderby' => 'comment_count'
- ) );
但是需求总是不停的变化,现在又有了新需求,获取最新被评论的文章列表,意思就是某篇文章刚被评论,它就排到最前面,在某些社交需求的网站可能需要用到。
因为 WP_Query Class 排序参数没有 comment_date 选项,所以不能直接使用它,那么这样两个表连表查询一般来说只能通过 SQL 来实现了。
但是使用 SQL 来实现可能就会造成 API 不一致的问题,无法直接使用 WP_Query 进行各种操作,所以最好是通过 posts_clauses 接口实现让 WP_Query 排序参数支持 comment_date:
- add_filter('posts_clauses', function ($clauses, $wp_query){
- global $wpdb;
- $orderby = $wp_query->get('orderby');
- $order = $wp_query->get('order') ?: 'DESC';
- if($orderby == 'comment_date'){
- $clauses['fields'] .= ', ct.comment_post_ID, MAX(ct.comment_ID) as cid';
- $clauses['join'] = "INNER JOIN {$wpdb->comments} AS ct ON {$wpdb->posts}.ID = ct.comment_post_ID AND ct.comment_parent=0 AND ct.comment_approved NOT IN ('spam', 'trash', 'post-trashed')";
- $clauses['groupby'] = "ct.comment_post_ID";
- $clauses['orderby'] = "cid {$order}";
- }
- return $clauses;
- }, 10, 2);
上面的代码简单解释一下,就是通过 posts_clauses 接口实现文章表和评论表连表,然后通过评论时间进行排序获取最新被评论的文章列表。
当然你也可以不需要了解和使用上面的代码,因为 WPJAM Basic 已经整合,你只需要知道最后可以通过下面简单的方式就能够获取最新被评论的文章列表:
- $query = new WP_Query( array(
- 'orderby' => 'comment_date'
- ) );